简单的SQLAlchemy SubFactory示例

时间:2018-05-15 01:27:16

标签: python sqlalchemy factory-boy

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

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)无法调整类型'Group'[SQL:'INSERT INTO Person(group_id)VALUES(%(group_id)s,')] [参数:{'group_id' :}]

如何使用declarative_base()和外键关系正确设置模型,以便FactoryBoy的{​​{1}}能够正确填充依赖模型?

1 个答案:

答案 0 :(得分:1)

正如您已经注意到的那样,不是将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将对象刷新到数据库时,SQLAlchemy将正确处理设置外键。