由于sqlalchemy.orm.relationship()
已经暗示了这种关系,我不想在db中创建约束。我该怎么办?
目前我在alembic迁移后手动删除这些约束。
答案 0 :(得分:29)
而不是定义"架构"级别ForeignKey
约束创建custom foreign condition;传递你想要用作"外键"和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')
您可以验证表 c 没有发出FOREIGN KEY
个约束:
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)
)
警告:强>
请注意,如果数据库端没有FOREIGN KEY
约束,您可以将您的参照完整性分解为任何您想要的方式。 ORM /应用程序级别存在关系,但无法在数据库中强制执行。