我面临一个SQLite错误,尽管我没有使用任何显式的AutoCommit true或false。任何人都可以提供关于此错误的任何输入。什么情况下会出现这个错误。先谢谢你了。Regards,Manasi保存
r55awzrz1#
当我在一个循环中遍历表条目时,我反复遇到类似的问题(在我的情况下,这是一个不可能的回滚)。只要游标正在处理这些条目,SQL语句就处于“进行中”。我不知道这是否也禁止提交,但它可能是。当您尝试处理表条目并在同一个或不同的表中插入条目时,您可能希望尝试在内存中收集数据,并在循环后执行插入或更新。其他信息:在SQLite中,“Autocommit”通常默认为“True”(当然,它也可能取决于您使用的访问层--我使用的是Python和apsw,所以我不能在Java中告诉您更多)。这意味着,每个插入都是立即自动提交的。==〉这可能是另一种解决方案。您可以尝试显式地打开一个事务并在循环后提交它,而不是将数据存储在内存中--这样,问题也应该消失。
pw136qt22#
如果不使用RETURNING子句返回的值,则可能发生该错误。我可以提供一个复制代码,虽然它是在Python中。这是可行的:
RETURNING
# Connect to an in-memory database import sqlite3 conn = sqlite3.connect(":memory:") # Create a table conn.execute("CREATE TABLE t(c)") conn.commit() # INSERT ... RETURNING with fetchall() cursor = conn.execute("INSERT INTO t VALUES (1) RETURNING rowid") cursor.fetchall() # returns [(1,)] conn.commit() # no error
这不起作用:
# Connect to an in-memory database import sqlite3 conn = sqlite3.connect(":memory:") # Create a table conn.execute("CREATE TABLE t(c)") conn.commit() # INSERT ... RETURNING without fetchall() cursor = conn.execute("INSERT INTO t VALUES (1) RETURNING rowid") # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # sqlite3.OperationalError: cannot commit transaction - SQL statements in progress conn.commit()
2条答案
按热度按时间r55awzrz1#
当我在一个循环中遍历表条目时,我反复遇到类似的问题(在我的情况下,这是一个不可能的回滚)。只要游标正在处理这些条目,SQL语句就处于“进行中”。我不知道这是否也禁止提交,但它可能是。
当您尝试处理表条目并在同一个或不同的表中插入条目时,您可能希望尝试在内存中收集数据,并在循环后执行插入或更新。
其他信息:在SQLite中,“Autocommit”通常默认为“True”(当然,它也可能取决于您使用的访问层--我使用的是Python和apsw,所以我不能在Java中告诉您更多)。这意味着,每个插入都是立即自动提交的。
==〉这可能是另一种解决方案。您可以尝试显式地打开一个事务并在循环后提交它,而不是将数据存储在内存中--这样,问题也应该消失。
pw136qt22#
如果不使用
RETURNING
子句返回的值,则可能发生该错误。我可以提供一个复制代码,虽然它是在Python中。这是可行的:
这不起作用: