2016-02-22 2 views
0

Я пытаюсь вставить данные в таблицу с идентификатором, который сопоставляется с другой таблицей, и я ожидаю, что он создаст данные, необходимые для моих отношений ... Проблема в том, что в родитель, у меня есть еще одно соотношение, и ребенка, я также относятся к Младенцу от родителей ... Смотри ниже:ошибка дублирования ключа при взаимодействии внешнего ключа на нескольких таблицах

class Parent(Base): 
    parent_field = Column(Integer) 
    childa_id = Column(Integer, ForeignKey(ChildATable.childa_id)) 
    childb_id = Column(Integer, ForeignKey(ChildBTable.childb_id)) 

    childa = relationship(ChildATable) 
    childb = relationship(ChildBTable) 


class ChildA(Base): 
    childa_id = Column(Integer, primary_key=True) 
    childb_id = Column(Integer, ForeignKey(ChildB.childb_id)) 


class ChildB(Base): 
    childb_id = Column(Integer, primary_key=True) 


class ParentTable(factory.alchemy.SQLAlchemyModelFactory) 
    class Meta: 
     .... 

    parent_field = factory.Sequence(lambda n: n + 1) 
    childa = factory.SubFactory(ChildA) 
    childb = factory.SubFactory(ChildB) 

class ChildATable(factory.alchemy.SQLAlchemyModelFactory) 
    class Meta: 
     .... 

    childa_id = factory.Sequence(lambda n: n + 1) 
    childb = factory.SubFactory(ChildB) 

class ChildBTable(factory.alchemy.SQLAlchemyModelFactory) 
    class Meta: 
     .... 

    childb_id = 1 #I need this to be hardcoded to 1 

проблема заключается в том, что, когда я использую фабрику, чтобы вставить родитель, по-видимому, это пытается дважды вставить таблицу childb, поскольку она указана в родительском и childa, потому что я продолжаю получать дублирующий ключ для childb_id ... А как вы можете предотвратить это?

Пути создать фабрику путем создания родительского объекта и совершения сеанса:

Parent() 
Session.commit() 
+0

Как вы «Использование фабрики вставить Родитель»? Можете ли вы разместить фабрики для родителей и детей? – Oin

+0

Я задал вопрос с вашей просьбой – Bodao

ответ

1

Под капотом, ваш призыв к ParentTable() будет переводить:

  1. Зов ChildATable()
  2. В ChildATable(), вызовите ChildBTable()
  3. Вызов ChildBTable() снова, на этот раз от ParentTable()

Если вы хотите, чтобы ваши две фабрики, чтобы использовать один и тот же объект ChildB(), вы можете изменить ваш ParentTable() завод следующим образом:

class ParentTable(factory.alchemy.SQLAlchemyModelFactory) 
    class Meta: 
     .... 

    parent_field = factory.Sequence(lambda n: n + 1) 
    childa = factory.SubFactory(ChildA, 
     # Forward our `childb` to the `ChildA()` factory 
     childb=factory.SelfAttribute('..childb'), 
    ) 
    childb = factory.SubFactory(ChildB) 
0

Я подозреваю, что вы получаете тот же номер для n в два subfactories. Можете ли вы попробовать что-то вроде этого?

class ParentTable(factory.alchemy.SQLAlchemyModelFactory) 
    class Meta: 
     .... 

    parent_field = factory.Sequence(lambda n: 2*n + 1) 
    childa = factory.SubFactory(ChildA) 
    childb = factory.SubFactory(ChildB)