sqlalchemy:在db中创建关系但没有外键约束?

est*_*est 15 python orm sqlalchemy foreign-keys

既然sqlalchemy.orm.relationship()已经暗示了这种关系,我不想在db中创建约束.我该怎么办?

目前我在alembic迁移后手动删除这些约束.

Ilj*_*ilä 34

而不是定义"模式"级别ForeignKey约束创建自定义外部条件 ; 传递你想用作"外键"和primaryjointo的列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')
   ...:     
Run Code Online (Sandbox Code Playgroud)

外键也可以在primaryjoin使用中内联注释foreign():

a = relationship('A', primaryjoin='foreign(C.a_id) == A.a_id')
Run Code Online (Sandbox Code Playgroud)

您可以验证FOREIGN KEYc没有发出约束:

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)
)
Run Code Online (Sandbox Code Playgroud)

警告:

请注意,如果FOREIGN KEY数据库端没有约束,您可以将参照完整性分解为任何您想要的方式.ORM /应用程序级别存在关系,但无法在数据库中强制执行.