&引用;“关于删除级联”;使用Python时不起作用
这里我提供了一个完全可复制的代码,它演示了整个问题。问题是,当我从“父”表中删除行时,“子”表中的对应行不会被删除,即使它们有一个外键,指定了delete CASCADE。这就是代码:&引用;“关于删除级联”;使用Python时不起作用,python,sqlite,Python,Sqlite,这里我提供了一个完全可复制的代码,它演示了整个问题。问题是,当我从“父”表中删除行时,“子”表中的对应行不会被删除,即使它们有一个外键,指定了delete CASCADE。这就是代码: >>> import sqlite3 >>> cnx = sqlite3.connect("mytest.db") >>> cursor = cnx.cursor() >>> cnx.execute("BEGIN") <sqlite3.
>>> import sqlite3
>>> cnx = sqlite3.connect("mytest.db")
>>> cursor = cnx.cursor()
>>> cnx.execute("BEGIN")
<sqlite3.Cursor object at 0x7f0ab0923490>
>>> cursor.execute("CREATE TABLE test_table (id integer)")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> cursor.execute("CREATE UNIQUE INDEX id_primary ON test_table(id)")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> cursor.execute("INSERT INTO test_table (id) VALUES (1),(2),(3)")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> cursor.execute("CREATE TABLE test_table_2(id_fk integer, txt text, FOREIGN KEY (id_fk) REFERENCES test_table(id) ON DELETE CASCADE)")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> cursor.execute("INSERT INTO test_table_2 (id_fk, txt) VALUES (1,\"one\"),(2,\"two\"),(3,\"three\")")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> res = cursor.execute("SELECT * FROM test_table_2")
>>> res
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> for r in res:
... print(r)
...
(1, 'one')
(2, 'two')
(3, 'three')
>>> cursor.execute("PRAGMA foreign_keys = ON")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> cursor.execute("DELETE FROM test_table WHERE id = 1")
<sqlite3.Cursor object at 0x7f0ab0923420>
>>> res = cursor.execute("SELECT * FROM test_table_2")
>>> for r in res:
... print(r)
...
(1, 'one')
(2, 'two')
(3, 'three')
导入sqlite3
>>>cnx=sqlite3.connect(“mytest.db”)
>>>cursor=cnx.cursor()
>>>执行(“开始”)
>>>cursor.execute(“创建表测试\表(id整数)”)
>>>execute(“在test_表(id)上创建唯一索引id_primary”)
>>>执行(“插入测试表(id)值(1)、(2)、(3)”)
>>>cursor.execute(“创建表test\u TABLE\u 2(id\u fk整数,txt文本,外键(id\u fk)引用DELETE CASCADE上的test\u TABLE(id)”)
>>>cursor.execute(“插入测试表2(id\U fk,txt)值(1,\'one'”,“2,\'two'”,“3,\'three\”)
>>>res=cursor.execute(“从测试表2中选择*)
>>>res
>>>对于r in res:
... 印刷品(r)
...
(一")
(二")
(三")
>>>cursor.execute(“PRAGMA foreign_keys=ON”)
>>>cursor.execute(“从test_表中删除,其中id=1”)
>>>res=cursor.execute(“从测试表2中选择*)
>>>对于r in res:
... 印刷品(r)
...
(一")
(二")
(三")
如您所见,我甚至在执行DELETE
之前显式运行了PRAGMA-foreign\u-keys=ON
,但这没有帮助。顺便说一句,如果我在sqlite3>
提示符下运行这些命令,那么一切都正常。因此,整个问题在于Python
库。pragma是事务内部的no-op
该pragma是事务中的no op;只有在没有挂起的开始或保存点时,才能启用或禁用外键约束强制
pragma是事务内部的no-op
该pragma是事务中的no op;只有在没有挂起的开始或保存点时,才能启用或禁用外键约束强制
如果Python中存在问题,应该将其作为bug来提出。我想,问题不在于Python本身,而在于库。或者,可能是我做错了什么。
sqlite3
在标准库中,所以如果从Python外部执行,您仍然可以报告它是否工作?我不知道库会如何影响这一点,它应该只是将所有内容传递给sqlite。我在问题中已经说过,它在纯sqlite3 promptIf中的Python之外工作。如果Python中存在问题,您应该将其作为bug提出。我想,问题不在于Python本身,而在于库。或者,可能是我做错了什么。sqlite3
在标准库中,所以如果从Python外部执行,您仍然可以报告它是否工作?我不知道库会如何影响这一点,它应该将所有内容传递给sqlite。我在问题中已经说过,它在纯sqlite3 promptI的Python之外工作。我不完全理解这一点。如果是这样,我应该怎么做才能使它工作,或者获得所需的行为?@Jacobian ExecutePRAGMA FOREIGN\u KEYS=on
在事务之外。请不要在执行BEGIN
语句或Python通过INSERT
/UPDATE
语句隐式启动事务后执行它。谢谢!我马上查一下,我不完全明白这一点。如果是这样,我应该怎么做才能使它工作,或者获得所需的行为?@Jacobian ExecutePRAGMA FOREIGN\u KEYS=on
在事务之外。请不要在执行BEGIN
语句或Python通过INSERT
/UPDATE
语句隐式启动事务后执行它。谢谢!我马上查一下。