python - 为什么 SQLAlchemy 不使用 SQLite 强制执行外键约束?

标签 python sqlite sqlalchemy foreign-keys

我对 SqlAlchemy 外键约束有一些误解。我的理解是,下面插入 B 应该引发ForeignKeyConstraint 异常,因为没有 A"my_a" 作为名称。这不是外键约束的作用吗?更新约束表时要求约束映射的表列中存在值?

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 – 即使是现代版本 – 默认情况下不强制执行外键。

Assuming the [SQLite] library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command.

SQLite documentation

SQLAlchemy documentation

关于python - 为什么 SQLAlchemy 不使用 SQLite 强制执行外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64811882/

相关文章:

Python:截断的日志记录级别名称(字符串格式)自定义

python - 如何在机器人框架中动态导入变量文件

如果里面的文本包含特定文本,则 SQLite 选择字段

spring - SQLITE 和外键支持

python - 使用 SQLAlchemy 删除和读取索引

python - 从原始 sql 到 flask-sqlalchemy

postgresql - 使用 SQLAlchemy 创建存储过程

Python plotly |禁用具有子图的图形中的所有范围 slider

linux - 链接 ARM 上的 SQLite3(x86_64 主机)

python - 我可以使用 Python 3 'with open(filename, mode) as file:' 并将其保存在对象中以向其发送事件吗?