首页 > 解决方案 > 没有 COMMIT 事务的 Python Sqlite3 执行脚本(sql_script)

问题描述

来自Python Sqlite3 的文档

executescript(sql_script)

这是一次执行多个 SQL 语句的非标准便捷方法。它首先发出一个 COMMIT 语句,然后执行它作为参数获取的 SQL 脚本。此方法忽略isolation_level;任何事务控制都必须添加到 sql_script。

我的问题: 我正在执行一系列带有多个语句的 sql 脚本,例如:

db = sqlite3.connect(my_db_path)
for sql_file in files:
  f = open(sql_file)
  update_script = f.read()
  f.close()
  
  db.executescript(update_script)

executescript()方法在执行之前进行提交,因此如果它在过程中间失败,我无法对所有文件进行事务控制以回滚到初始状态,因为它在每次迭代时都提交。

我需要一种仅在 for 循环之后而不是在每次迭代结束时提交的方法。我没有设法使该方法execute()工作,因为它不支持多个语句,而且我也没有设法使它与executemany()方法一起工作,因为如果我的文件恰好只有一个语句,它将失败。

有什么建议么?

标签: pythonsqlite

解决方案


如果所有脚本都需要作为一个事务执行,而不是读取,执行,读取,执行,......尝试读取,读取,读取......执行。也就是说,将所有文件的内容读入update_script,然后执行。


推荐阅读