2010-07-21 16 views
6

Eseguo il seguente codice da un interprete python e mi aspetto che l'istruzione di inserimento non abbia esito positivo e generi qualche eccezione. Ma non sta succedendo:Perché le mie chiavi esterne sqlite3 non funzionano?

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!? 
... 
>>> 

Qualcuno sa perché questo non vuole funzionare? La mia comprensione è che l'inserimento dovrebbe fallire poiché il valore che ho dato per t2(i) non è una chiave primaria in t1, ma lo fa felicemente comunque ...?

risposta

10

Il supporto delle chiavi esterne di lavoro in SQLite è molto nuovo - è stato rilasciato solo il 3.6.19 il 14 ottobre. Sei sicuro di usare SQLite 3.6.19 o successivo?

Controllare la costante sqlite_version nel modulo sqlite3. Per esempio. su un sistema Mac OS X 10.6 con il pitone/sqlite installazione di default:

>>> import sqlite3 
>>> sqlite3.sqlite_version 
'3.6.12' 
>>> 
+0

Stavo per dire che devo, perché posso farlo funzionare con l'interprete interattivo sqlite, ma poi ho capito che Python ha il suo sqlite integrato - Devo averne uno nuovo sul mio sistema ma non in il mio pitone. Grazie –

+0

Ah, avevi ragione, ho 3.5.9. –

2

Come detto da Nicholas, controllare se la vostra versione di SQLite ha il supporto chiave esterna. Non importa se la versione di sqlite è maggiore o uguale a 3.6.19. La fonte può essere compilata con il supporto di chiave esterna disattivato. Per controllare eseguire il seguente comando.

cursor.execute("PRAGMA foreign_keys")

Se non restituisce alcun dato, la versione non ha supporto per chiave esterna.

NB: Il supporto per chiave esterna non viene applicato in sqlite3 al momento. Controlla here.

+1

Non è vero? In sqlite 3.8.10 sembra applicarlo bene con il pragma foreign_keys attivato su –

+0

Secondo la loro documentazione, non è così. A partire da ora non ho trovato alcun motivo per dubitarne, perché il mio db si comporta proprio così. Comunque controllerò la versione 3.8.10. – Charitoo

+1

L'ho provato con il mio modulo sqlite3 di installazione di python 3.5 (che usa 3.8.11) e anche i vincoli di chiave esterna sono supportati. Violare uno mi dà un errore 'sqlite3.IntegrityError: FOREIGN KEY failed' –

Problemi correlati