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

Car*_*ers 7 python sqlite foreign-keys

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

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!?
...
>>>
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*ght 9

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

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

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.6.12'
>>> 
Run Code Online (Sandbox Code Playgroud)


Cha*_*too 5

正如尼古拉斯所说,检查您的 sqlite 版本是否有外键支持。如果sqlite的版本大于或等于3.6.19,这并不重要。可以在关闭外键支持的情况下编译源代码。要检查,请执行以下命令。

光标.execute("PRAGMAforeign_keys")

如果它不返回任何数据,则您的版本不支持外键。

注意:到目前为止,sqlite3 中尚未强制执行外键支持。看看这里