1

したがって、SQLAlchemy(0.8)ではこの1対多の関係があります。

class Parent(Base):

    __tablename__ = "parents"

    cid = Column(Integer(11), primary_key = True, autoincrement = False)
    uid = Column(Integer(11), ForeignKey('otherTable.uid',
           ondelete = 'CASCADE'), primary_key = True)
    ...

    # Relationship with child
    childs_rel = relationship("Child", backref = 'parents', 
                              cascade = "all, delete-orphan")

class Child(Base):

    __tablename__ = "childs"

    mid = Column(Integer(11), primary_key = True, autoincrement = False)
    cid = Column(Integer(11), ForeignKey('parents.cid',
           ondelete = 'CASCADE'), primary_key = True)
    uid = Column(Integer(11), ForeignKey('parents.uid',
           ondelete = 'CASCADE'), primary_key = True)
    ...

このデータベースを作成することはできますが、それを操作しようとすると、次のエラーが発生します。

sqlalchemy.exc.AmbiguousForeignKeysError:関係Parent.childs_relの親/子テーブル間の結合条件を判別できませんでした-テーブルをリンクする複数の外部キーパスがあります。'foreign_keys'引数を指定して、親テーブルへの外部キー参照を含むものとしてカウントする必要がある列のリストを提供します。

childs_relで「foreign_keys」を指定しようとしましたが、Parentのクラスに外部キーがないと言われています。これは本当です...これは子のクラスで指定する必要がありますが、SQLAlchemyのORMドキュメントによると、関係は「 「1対多」の関係の1つ..

http://docs.sqlalchemy.org/en/rel_0_8/orm/relationships.html#one-to-many

ここで何が起こっていると思いますか?ありがとう!

4

1 に答える 1

2

私はここで何が起こっているのか知っていると思います:

ForeignKeyオブジェクトを使用して、「複合」外部キー制約、つまり複数の親/子列のグループ化間の制約を定義できないことに注意してください。このグループ化を定義するには、ForeignKeyConstraintオブジェクトを使用して、テーブルに適用する必要があります。関連するForeignKeyオブジェクトは自動的に作成されます。

すみません。とにかくThx!:D

編集:これがそれを必要とする人のための私の解決策です:

class Child(Base):

    __tablename__ = "childs"

    mid = Column(Integer(11), primary_key = True, autoincrement = False)
    cid = Column(Integer(11), primary_key = True)
    uid = Column(Integer(11), primary_key = True)

    __table_args__ = (ForeignKeyConstraint([cid, uid], [Parent.cid, Parent.uid]), {})
于 2013-03-21T09:45:47.207 に答える