Почему мои внешние ключи sqlite3 не работают? - PullRequest
6 голосов
/ 21 июля 2010

Я запускаю следующий код из интерпретатора 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, но оно, к счастью, делает это в любом случае ...?

Ответы [ 2 ]

10 голосов
/ 21 июля 2010

Рабочая поддержка внешнего ключа в SQLite очень нова - она ​​была выпущена только в 3.6.19 14 октября.Вы уверены, что используете SQLite 3.6.19 или новее?

Проверьте константу sqlite_version в модуле sqlite3.Например, в системе Mac OS X 10.6 с установленной по умолчанию установкой python / sqlite:

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.6.12'
>>> 
3 голосов
/ 05 марта 2016

Как сказал Николас, проверьте, есть ли в вашей версии sqlite поддержка внешнего ключа. Это не имеет значения, если версия sqlite больше или равна 3.6.19. Источник может быть скомпилирован с отключенной поддержкой внешнего ключа. Для проверки выполните следующую команду.

cursor.execute ("PRAGMA foreign_keys")

Если данные не возвращаются, значит, ваша версия не поддерживает внешний ключ.

NB: Поддержка внешнего ключа не поддерживается в sqlite3 на данный момент. Проверьте здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...