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

问题描述 投票:0回答:1

我对 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()
python sqlite sqlalchemy foreign-keys
1个回答
2
投票

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

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

SQLite 文档

SQLAlchemy 文档

© www.soinside.com 2019 - 2024. All rights reserved.