当脚本从Windows命令行运行时,由于“正在进行SQL语句”,Python sqlite3无法回滚事务。

时间:2016-08-11 15:53:54

标签: python sqlite

我在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

1 个答案:

答案 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")

它从调试器中提交了很好的信息。我不知道背后的实际原因。