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 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)
)
Run Code Online (Sandbox Code Playgroud)
警告:
请注意,如果FOREIGN KEY数据库端没有约束,您可以将参照完整性分解为任何您想要的方式.ORM /应用程序级别存在关系,但无法在数据库中强制执行.