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

时间:2016-06-14 08:20:08

标签: python orm sqlalchemy foreign-keys

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

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

1 个答案:

答案 0 :(得分:29)

而不是定义"架构"级别ForeignKey约束创建custom foreign condition;传递你想要用作"外键"和primaryjoinrelationship。您必须手动定义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')
   ...:     

外部密钥也可以使用primaryjoinforeign()内联注释:

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 /应用程序级别存在关系,但无法在数据库中强制执行。