无需定义“模式”级别
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') ...:外键也可以在
primaryjoinusing中内联注释
foreign():
a = relationship('A', primaryjoin='foreign(C.a_id) == A.a_id')您可以验证没有
FOREIGN KEY为表 c 发出约束:
In [4]: from sqlalchemy.schema import CreateTableIn [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))
警告:
请注意,
FOREIGN KEY在数据库端没有适当的约束,您可以以任何所需的方式将参照完整性破坏成碎片。在ORM
/应用程序级别存在关系,但是不能在数据库中强制执行。



