python - 为什么我的 sqlite3 外键不起作用?

标签 python foreign-keys sqlite

我从 python 解释器运行以下代码,并期望插入语句失败并抛出某种异常。但它没有发生:

Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> conn = sqlite3.connect("test.db")
>>> conn.executescript("""
... pragma foreign_keys=on;
... begin transaction;
... create table t1 (i integer primary key, a);
... create table t2 (i, a, foreign key (i) references t1(i));
... commit;
... """)
<sqlite3.Cursor object at 0x0229DAA0>
>>> c = conn.cursor()
>>> c.execute("insert into t2 values (6, 8)")
<sqlite3.Cursor object at 0x0229DAD0>
>>> #???
...
>>> conn.commit()
>>> #???????????
...
>>> c.execute("select * from t2")
<sqlite3.Cursor object at 0x0229DAD0>
>>> c.fetchall()
[(6, 8)]
>>> #but why!?
...
>>>

有谁知道为什么这不起作用?我的理解是,插入应该失败,因为我为 t2(i) 提供的值不是 t1 中的主键,但无论如何它都很乐意这样做...... ?

最佳答案

SQLite 中的工作外键支持是非常新的——它仅在 10 月 14 日的 3.6.19 中发布。您确定使用的是 SQLite 3.6.19 或更高版本吗?

检查 sqlite3 模块中的 sqlite_version 常量。例如。在具有默认 python/sqlite 安装的 Mac OS X 10.6 系统上:

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.6.12'
>>> 

关于python - 为什么我的 sqlite3 外键不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3296040/

相关文章:

c# - SQLite:没有这样的表

c++ - 高效更新多条记录的 SQLite 表

javascript - Python 提交带有请求的标签

python - 无法使用 xpath 获取 youtube 视频的持续时间

android - ORMLite 查询外键

c# - Entity Framework 5 Code First 自引用关系

java - 更新安卓数据库

python - 无法在 python 中安装 zope.interface 3.6.1

python - 删除列表中的重复数据框

java - 如何使用纯 JPA/Hibernate 注释避免违反外键约束