首页 > 解决方案 > SqlAlchemy:如果外键不存在,为什么 session.commit() 不会失败?

问题描述

我对 SqlAlchemy ForeignKey 约束有误解。我的理解是,B下面的插入应该引发 ForeignKeyConstraint 异常,因为它的名称没有Awith "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()

标签: pythonsqlitesqlalchemyforeign-keys

解决方案


SQLite - 即使是现代版本 - 默认情况下不强制执行外键。

假设 [SQLite] 库是在启用外键约束的情况下编译的,它仍然必须由应用程序在运行时使用 PRAGMA foreign_keys 命令启用。

SQLite 文档

SQLAlchemy 文档


推荐阅读