gpt4 book ai didi

python - sqlalchemy:创建关系但在数据库中没有外键约束?

转载 作者:太空狗 更新时间:2023-10-29 17:11:33 25 4
gpt4 key购买 nike

因为 sqlalchemy.orm.relationship() 已经暗示了关系,我不想在数据库中创建约束。我该怎么办?

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

最佳答案

而不是定义“架构”级别ForeignKey约束创建一个 custom foreign condition ;传递您想用作“外键”的列和 primaryjoinrelationship .您必须手动定义 primaryjoin因为:

By default, this value is computed based on the foreign key relationships of the parent and child tables (or association table).

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/应用程序级别存在关系,但不能在 DB 中强制执行。

关于python - sqlalchemy:创建关系但在数据库中没有外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com