1

我正在使用 pytest 和 Factory Boy 测试我的 SQLAlchemy 模型,但我发现他们的文档缺乏关系。我已经设置了我的架构,所以有些用户可以属于多个组(组可以容纳多个用户)并且他们可以有多个令牌,但一个令牌只属于一个用户:

_user_groups_table = Table(
    'user_groups', Base.metadata,
    Column('user_id', INTEGER(unsigned=True), ForeignKey('user.id')),
    Column('group_id', INTEGER(unsigned=True), ForeignKey('user_group.id'))
)


class UserGroup(Base):
    __tablename__ = 'user_group'

    id = Column(INTEGER(unsigned=True), Sequence('user_group_id_seq'), primary_key=True, autoincrement=True)
    name = Column(String(255), unique=True, nullable=False)


class User(Base):
    __tablename__ = 'user'

    id = Column(INTEGER(unsigned=True), Sequence('user_id_seq'), primary_key=True, autoincrement=True)
    name = Column(String(255), unique=True, nullable=False)
    groups = relationship('UserGroup', secondary=_user_groups_table)
    auth_tokens = relationship('Token', cascade='delete')


class Token(Base):
    __tablename__ = 'token'

    id = Column(INTEGER(unsigned=True), Sequence('token_id_seq'), primary_key=True, autoincrement=True)
    user_id = Column(INTEGER(unsigned=True), ForeignKey('user.id'), nullable=False)
    value = Column(String(511), unique=True, nullable=False)

我一直在尝试不同的东西,包括将组和令牌添加到用户实例的 @factory.post_generation 方法,但是当我将用户放入固定装置并在我的测试函数中使用它时,这些字段永远不会出现。您对如何使用 Factory Boy 对该模式进行建模有什么建议吗?

4

1 回答 1

0

我正在为我不了解工厂男孩的 sqlalchemy 部分写这篇文章。您已经有一个表,可以让您在用户和组(UserGroup 表)和用户令牌之间建立 n 对 n 关系,例如:

id user_id group_id        id user_id value
1    5      3              1  5       adb45
2    5      4              2  5       xyz01
3    5      5
4    1      9
5    1      3    

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), unique=True, nullable=False)

    tokens = relationship("Token", backref="user")

class Group(Base):
    __tablename__ = "groups"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(255), unique=True, nullable=False)

class UserGroup(Base):
    __tablename__ = "usergroups"
    id = Column(Integer, primary_key=True, autoincrement=True)
    group_id = Column(Integer, ForeignKey("Group.id"))
    user_id = Column(Integer, ForeignKey("User.id"))

class Token(Base):
    __tablename__ = "tokens"
    id = Column(Integer, primary_key=True, autoincrement=True)
    value = Column(String(511), unique=True, nullable=False)

    user_id = Column(Integer, ForeignKey("User.id"))

并且 sqlalchemy 文档很好。

于 2016-12-08T13:44:21.263 回答