简单的 SQLAlchemy 子工厂示例

Simple SQLAlchemy SubFactory example

我正在尝试在现有数据库上使用基本 SQLAlchemy 模型实施 FactoryBoy。下面是我的设置的粗略近似值,以及呈现的错误。

Model.py

base = declarative_base()

class Person(Base):
  person_id = Column(Integer, autoincrement=True, primary_key=True)
  group_id = Column(ForeignKey(Group.group_id))


class Group(Base)
  group_id = Column(Integer, autoincrement=True, primary_key=True)

Factory.py

class PersonFactory(SQLAlchemyModelFactory):
  group_id = factory.SubFactory(GroupFactory)

class GroupFactory(SQLAlchemyModelFactory):
  pass

test.py

PersonFactory.create()

错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Group' [SQL: 'INSERT INTO Person (group_id) VALUES (%(group_id)s,')] [parameters: {'group_id': }]

如何使用 declarative_base() 和外键关系正确设置模型,以便 FactoryBoySubFactory 正确填充相关模型?

而不是将 Group 实例分配给外键列属性,正如您自己指出的那样,创建一个工厂填充的 relationship() 属性:

class Person(Base):
    person_id = Column(Integer, autoincrement=True, primary_key=True)
    group_id = Column(ForeignKey(Group.group_id))
    group = relationship(Group)

...

class PersonFactory(SQLAlchemyModelFactory):
    group = factory.SubFactory(GroupFactory)

当 SQLAlchemy 将对象刷新到数据库时,它会正确地设置外键。