Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;“关于删除级联”;使用Python时不起作用_Python_Sqlite - Fatal编程技术网

&引用;“关于删除级联”;使用Python时不起作用

&引用;“关于删除级联”;使用Python时不起作用,python,sqlite,Python,Sqlite,这里我提供了一个完全可复制的代码,它演示了整个问题。问题是,当我从“父”表中删除行时,“子”表中的对应行不会被删除,即使它们有一个外键,指定了delete CASCADE。这就是代码: >>> import sqlite3 >>> cnx = sqlite3.connect("mytest.db") >>> cursor = cnx.cursor() >>> cnx.execute("BEGIN") <sqlite3.

这里我提供了一个完全可复制的代码,它演示了整个问题。问题是,当我从“父”表中删除行时,“子”表中的对应行不会被删除,即使它们有一个外键,指定了delete CASCADE。这就是代码:

>>> 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 Execute
PRAGMA FOREIGN\u KEYS=on
在事务之外。请不要在执行
BEGIN
语句或Python通过
INSERT
/
UPDATE
语句隐式启动事务后执行它。谢谢!我马上查一下,我不完全明白这一点。如果是这样,我应该怎么做才能使它工作,或者获得所需的行为?@Jacobian Execute
PRAGMA FOREIGN\u KEYS=on
在事务之外。请不要在执行
BEGIN
语句或Python通过
INSERT
/
UPDATE
语句隐式启动事务后执行它。谢谢!我马上查一下。