sqlalchemy.orm.relationship()
はすでに関係を暗示しているので、dbに制約を作成したくありません。私は何をすべきか?
現在、私はアレンビックマイグレーションの後にこれらの制約を手動で削除しています。
「スキーマ」レベルを定義する代わりに ForeignKey
制約を作成すると カスタム外部条件 ; 「外部キー」として使用する列と primaryjoin
を relationship
に渡します。次の理由により、手動で 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')
...:
_
primaryjoin
foreign()
を使用して、外部キーにインラインで注釈を付けることもできます。
_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では強制できません。