gpt4 book ai didi

python - 如何使用 Factory Boy 和 Flask-SQLAlchemy 设置依赖工厂?

转载 作者:太空狗 更新时间:2023-10-29 20:12:22 24 4
gpt4 key购买 nike

在 Flask-SQLAlchemy 和外键约束下使用 factory boy 的正确方法是什么?

考虑以下 Flask SQLAlchemy 模型设置:

# coding=utf-8
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

# ------------------------------
# SQLAlchemy Table Models
# ------------------------------
class User(db.Model):
""" A SQLAlchemy simple model class who represents a user with a ForeignKey Constraint"""
__tablename__ = 'UserTable'

user_pk = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.Unicode(20))
group_fk = db.Column(db.ForeignKey("GroupTable.group_pk"), nullable=False)


class Group(db.Model):
""" A SQLAlchemy simple model class who represents a user """
__tablename__ = 'GroupTable'

group_pk = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(), nullable=False)


# -------------------------
# Create the SQL tables
# -------------------------
db.create_all()

创建新用户时,用户模式需要组外键。由于组主键是从数据库分配的,工厂需要提交组条目并获取条目的主键以便它可以将其提供给新用户。

如何创建组,将其保存到数据库,并将其 key 提供给用户工厂?

Factory Boy has examples for dealing with Foreign Keys 但它们似乎不适用于 SQLAlchemy。以下是工厂和故障点:

# ----------------------------------------
# Factory-Boy User and Group Factories
# ----------------------------------------
from factory import alchemy, Sequence, RelatedFactory


class GroupFactory(alchemy.SQLAlchemyModelFactory):
class Meta(object):
model = Group
sqlalchemy_session = db.session # the SQLAlchemy session object

name = Sequence(lambda n: "Group {}".format(n))
# group_pk = Sequence(lambda n: n)


class UserFactory(alchemy.SQLAlchemyModelFactory):
class Meta(object):
model = User
sqlalchemy_session = db.session # the SQLAlchemy session object

user_pk = Sequence(lambda n: n)
name = Sequence(lambda n: u'User %d' % n) # coding=utf-8
group_fk = RelatedFactory(GroupFactory)


# ----------------------
# Factory tests
# ----------------------
# Create a new Group from our factory
group_from_factory = GroupFactory(name='a new group name')
assert group_from_factory.group_pk is None
# Save it to our DB
db.session.add(group_from_factory)
db.session.commit()

# Verify that Group Saved correctly to DB
group_from_db = db.session.query(Group).filter(Group.group_pk == group_from_factory.group_pk).first()
assert group_from_db.group_pk is not None
assert group_from_db.name == 'a new group name'
assert group_from_db.group_pk == group_from_factory.group_pk

# Create a new User from our factory
user_from_factory = UserFactory()
db.session.add(user_from_factory)
# ----------------------------------------------
# FAILS AT COMMIT() - NOT NULL constraint failed (group_fk is null)
# ----------------------------------------------
db.session.commit()

assert user_from_factory.user_pk is not None
assert user_from_factory.name is not None
assert user_from_factory.group_fk is not None

最佳答案

问题来自于使用 RelatedFactory:那些用于反向 ForeignKey 关系(例如,如果你想构建一个 已包含 User 的 Group 对象)。

对于直接的 ForeignKey - 比如从 UserGroup 的关系,使用 SubFactory:

class UserFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = User
sqlalchemy_session = db.session

# No need to force the user_pk, it is built automatically from the database
# user_pk = Sequence(lambda n: n)
name = Sequence(lambda n: u'User %d' % n) # coding=utf-8
group_fk = factory.SubFactory(GroupFactory)

我对 Flask-SQLAlchemy 不是很熟悉,但我刚刚在存储库(位于 https://github.com/rbarrois/factory_boy/tree/master/examples/flask_alchemy )中添加了一个小示例,该示例与您的情况非常相似。

关于python - 如何使用 Factory Boy 和 Flask-SQLAlchemy 设置依赖工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31439564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com