python - SqlAlchemy:如果外键不存在,为什么 session.commit() 不会失败?
问题描述
我对 SqlAlchemy ForeignKey 约束有误解。我的理解是,B
下面的插入应该引发 ForeignKeyConstraint 异常,因为它的名称没有A
with "my_a"
。这不是 ForeignKey 约束的作用吗?更新约束表时,要求约束映射的表列中存在值?
from sqlalchemy import Column, create_engine, ForeignKey, Integer, VARCHAR
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, primary_key=True)
name = Column(VARCHAR(32))
class B(Base):
__tablename__ = 'table_B'
id = Column(Integer, primary_key=True)
a_name = Column(VARCHAR(32), ForeignKey('table_A.name'), nullable=False)
engine = create_engine('sqlite:////tmp/AB.db.foo')
Base.metadata.create_all(engine)
Session = sessionmaker()
Session.configure(bind=engine)
b = B(a_name="my_a")
session = Session()
session.add(b)
session.commit()
session.close()
解决方案
SQLite - 即使是现代版本 - 默认情况下不强制执行外键。
假设 [SQLite] 库是在启用外键约束的情况下编译的,它仍然必须由应用程序在运行时使用 PRAGMA foreign_keys 命令启用。
推荐阅读
- apache-kafka-streams - Kafka 流提交偏移语义
- python - python中数据框中一列与多列之间的区别
- regression - 在 tf.keras 中理解线性回归模型调优的问题
- html - 如何在悬停时在具有深色覆盖背景的图像上覆盖透明文本?
- javascript - 使用角度 8 从查询列表中触发元素引用的点击事件
- c - 使用 while 循环打印 X
- php - 我们可以在没有 if 语句的情况下插入这些值吗?
- c# - WPF,Caliburn.micro:如何在当前绑定上下文之外绑定属性?
- d3.js - 当鼠标在图表上的任何位置时无法显示提示
- php - 使用 PHP 发送电子邮件联系表单数据