web-dev-qa-db-ja.com

sqlalchemy:リレーションを作成しますが、dbに外部キー制約はありませんか?

sqlalchemy.orm.relationship()はすでに関係を暗示しているので、dbに制約を作成したくありません。私は何をすべきか?

現在、私はアレンビックマイグレーションの後にこれらの制約を手動で削除しています。

19
est

「スキーマ」レベルを定義する代わりに ForeignKey 制約を作成すると カスタム外部条件 ; 「外部キー」として使用する列と primaryjoinrelationship に渡します。次の理由により、手動で primaryjoin を定義する必要があります。

デフォルトでは、この値は親テーブルと子テーブル(または関連テーブル)の外部キー関係に基づいて計算されます。

_In [2]: class A(Base):
   ...:     a_id = Column(Integer, primary_key=True)
   ...:     __tablename__ = 'a'
   ...:     

In [3]: class C(Base):
   ...:     c_id = Column(Integer, primary_key=True)
   ...:     a_id = Column(Integer)
   ...:     __tablename__ = 'c'
   ...:     a = relationship('A', foreign_keys=[a_id],
   ...:                      primaryjoin='A.a_id == C.a_id')
   ...:     
_

primaryjoinforeign() を使用して、外部キーにインラインで注釈を付けることもできます。

_a = relationship('A', primaryjoin='foreign(C.a_id) == A.a_id')
_

_FOREIGN KEY_制約がテーブルcに対して発行されていないことを確認できます。

_In [4]: from sqlalchemy.schema import CreateTable

In [5]: print(CreateTable(A.__table__))

CREATE TABLE a (
        a_id INTEGER NOT NULL, 
        PRIMARY KEY (a_id)
)



In [6]: print(CreateTable(C.__table__))

CREATE TABLE c (
        c_id INTEGER NOT NULL, 
        a_id INTEGER, 
        PRIMARY KEY (c_id)
)
_

警告:

DB側に_FOREIGN KEY_制約が設定されていない場合、参照整合性を任意の方法で分割することができることに注意してください。 ORM /アプリケーションレベルで関係がありますが、DBでは強制できません。

38
Ilja Everilä