2010-12-18 15 views
8

Revisé la lista de características varias veces, y parece que la conexión en cascada debería funcionar. Cuando ejecuta este script en Python:¿Cómo hacer que ON DELETE CASCADE funcione en sqlite 3.7.4?

#!/usr/bin/env python3 
import sqlite3 

print(sqlite3.sqlite_version) 

con = sqlite3.connect(':memory:') 

a = "create table a (id integer primary key, name text)" 
con.execute(a) 

b = "create table b (id integer primary key, r integer, foreign key(r) references a(id) on delete cascade)" 
con.execute(b) 
con.commit() 

a = "insert into a (name) values (\"abc\")" 
con.execute(a) 
con.commit() 

print(con.execute("select * from a").fetchall()) 

a = "insert into b (r) values (1)" 
con.execute(a) 
con.commit() 

print(con.execute("select * from b").fetchall()) 

a = "delete from a where id=1" 
con.execute(a) 
con.commit() 

print(con.execute("select * from b").fetchall()) 
print(con.execute("select * from a").fetchall()) 

puedo obtener estos resultados:

3.7.4 
[(1, 'abc')] 
[(1, 1)] 
[(1, 1)] 
[] 

lo que demuestra que en cascada no sucedió. ¿Qué hice mal o cuáles son las soluciones para obtener el mismo resultado que en cascada?

Respuesta

9

Las claves externas SQLite están deshabilitadas por razones de compatibilidad. Debe habilitarlos manualmente después de cada conexión a la base de datos.

con.execute("PRAGMA foreign_keys = ON")

2

Hay una mejor respuesta por el usuario Thibault J más en esta pregunta: Enable integrity checking with sqlite in django que dice:

from django.db.backends.signals import connection_created 
def activate_foreign_keys(sender, connection, **kwargs): 
    """Enable integrity constraint with sqlite.""" 
    if connection.vendor == 'sqlite': 
     cursor = connection.cursor() 
     cursor.execute('PRAGMA foreign_keys = ON;') 

connection_created.connect(activate_foreign_keys) 
+0

Aunque me quité el archivo de base de datos, se quitó todas las migraciones anteriores, y ha creado nuevas migraciones, esta no hizo ninguna diferencia para mí. Las tablas no se crearon con "on delete cascade" como se esperaba. Me pregunto por qué no está sucediendo eso. –

Cuestiones relacionadas