而不是定义“模式”级别ForeignKey http://docs.sqlalchemy.org/en/latest/core/constraints.html#sqlalchemy.schema.ForeignKey约束创造了一个定制国外条件 http://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#creating-custom-foreign-conditions;传递您想要用作“外键”的列以及primaryjoin http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship.params.primaryjoin to relationship http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship。您必须手动定义primaryjoin http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship.params.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 http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship.params.primaryjoin using foreign() http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.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)
)
Warning:
请注意,如果没有FOREIGN KEY
在数据库端施加约束,您可以以任何您想要的方式将引用完整性破坏成碎片。 ORM/应用程序级别存在关系,但无法在数据库中强制执行。