簡體   English   中英

從Windows命令行運行腳本時,由於“ SQL語句正在進行”,Python sqlite3無法回滾事務。

[英]Python sqlite3 cannot rollback transaction due to 'SQL statements in progress' when script run from Windows command line.

我正在使用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

萬一有人懷疑,我發現了問題。 在將數據庫的isolation_level設置為“無”之前,我先執行:

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

它可以很好地從調試器中得知。 我不知道背后的真正原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM