Простой пример SQLAlchemy SubFactory - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь реализовать 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,')] [parameters: {'group_id' :}]

Как правильно настроить модель с declarative_base() и отношением внешнего ключа, чтобы FactoryBoy SubFactory правильно заполнял зависимые модели?

1 Ответ

0 голосов
/ 15 мая 2018

Вместо присвоения экземпляру 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 будет правильно обрабатывать установку внешнего ключа, когда сбрасывает объекты в БД.

...