2010-07-21 53 views
6

我從python解釋器運行以下代碼,並期望insert語句失敗並拋出某種異常。但它沒有發生:爲什麼我的sqlite3外鍵不工作?

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中的主鍵,但它無論如何都樂於執行......?

回答

10

在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' 
>>> 
+0

我要說我必須,因爲我可以讓它與sqlite交互式解釋器一起工作,但後來我意識到python有自己的sqlite內置 - 我必須在我的系統上有一個新的,但不是我的蟒蛇。謝謝 – 2010-07-21 03:21:07

+0

啊,你說得對,我有3.5.9。 – 2010-07-21 03:24:25

2

至於說尼古拉斯,請檢查您的sqlite的版本有外鍵的支持。這並不重要,如果sqlite的版本大於或等於3.6.19。該源可能會在外鍵支持關閉的情況下編譯。要檢查執行以下命令。

cursor.execute("PRAGMA foreign_keys")

如果它沒有返回任何數據,那麼你的版本沒有外鍵支持。

注意:到目前爲止,在sqlite3中沒有強制執行外鍵支持。退房here

+1

不是嗎?在sqlite 3.8.10似乎強制執行它與foreign_keys編譯打開 – 2016-03-05 20:50:11

+0

罰款根據他們的文件,它沒有。到目前爲止,我還沒有找到任何理由懷疑它,因爲我的db的行爲就像那樣。無論如何,我會檢查出版本3.8.10。 – Charitoo 2016-03-06 19:35:06

+1

我試過用我的python 3.5安裝的sqlite3模塊(它使用3.8.11),並且還支持外鍵約束。違反一個給我一個'sqlite3.IntegrityError:FOREIGN KEY約束失敗' – 2016-03-06 20:05:43