我在Python中的某些sqlite3数据库上运行表合并。当其中一个合并函数由于条件而发现错误时,它返回False。如果返回False,则执行回滚。像这样:
con_out = sqlite3.connect('db',isolation_level=None)
out_cursor = con_out.cursor()
try:
out_cursor.execute("begin")
if not merge_table(in_cursor, out_cursor, verbose):
logging.error("rolling back changes")
out_cursor.execute("rollback")
return False
except Exception as e:
logging.error("rolling back changes: %s" % (str(e)))
out_cursor.execute("rollback")
return False
现在,当从PyCharm解释器执行此代码并返回False时,没有问题。它按预期正常回滚。但是,当从Windows命令行运行脚本时,它会给我这个错误:
sqlite3.OperationalError: cannot rollback transaction - SQL statements in progress
答案 0 :(得分:0)
如果有人想知道,我发现了问题。在我甚至将数据库的isolation_level设置为None之前,我执行:
out_cursor.execute("PRAGMA journal_mode = MEMORY")
db_con_out.commit()
由于某种原因,此声明未提交且仍在进行中,阻止了其他交易。当我用下面的代码包装它时,它工作
db_con_out.isolation_level = None
db_cursor.execute("begin")
if not execute_sql(db_cursor, "PRAGMA journal_mode = MEMORY;"):
db_cursor.execute("rollback")
sys.exit()
else:
db_cursor.execute("commit")
它从调试器中提交了很好的信息。我不知道背后的实际原因。