0

別のテーブルにマップする ID を持つテーブルにデータを挿入しようとしていますが、関係に必要なデータが作成されることを期待しています...問題は、親内に別の関係があり、子にあることです。私は親からの子にも関係しています...以下を参照してください:

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

問題は、factory を使用して Parent を挿入すると、childb_id の重複キーを取得し続けるため、parent と childa で参照されていることを考えると、どうやら childb テーブルを 2 回挿入しようとすることです...これを防ぐ方法はありますか?

ファクトリを作成する方法は、Parent オブジェクトを作成してセッションをコミットすることです。

Parent()
Session.commit()
4

2 に答える 2

1

内部では、 への呼び出しは次のParentTable()ように変換されます。

  1. 電話ChildATable()
  2. 以内ChildATable()に電話するChildBTable()
  3. もう一度電話ChildBTable()して、今度はParentTable()

2 つのファクトリで同じ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)
于 2016-02-22T22:17:23.230 に答える
0

2 つのサブファクトリーで同じ数を取得していると思われますn。このようなことを試すことができますか?

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

    parent_field = factory.Sequence(lambda n: 2*n + 1)
    childa = factory.SubFactory(ChildA)
    childb = factory.SubFactory(ChildB)
于 2016-02-22T16:16:32.307 に答える