Python 3.6.0的sqlite3模块无法执行VACUUM语句
2016-12-23 18:10
309 查看
Python 3.6.0的sqlite3模块存在一个bug(见issue 28518),无法执行VACUUM语句。Python 3.6.1已经修复这个bug。
一执行就出现异常:
Traceback (most recent call last):
File "D:\desktop\cannot_vacuum.py", line 25, in <module>
conn.execute('VACUUM')
sqlite3.OperationalError: cannot VACUUM from within a transaction
这是因为在真正执行VACUUM之前,Python 3.6.0的sqlite3模块(自作主张地)添加了一条BEGIN语句创建了一个事务,而VACUUM不能在事务中执行。
在Python 3.6.0,要想让程序正常运行,需要在connect时设置isolation_level参数为None,如下:
conn = sqlite3.connect('test.db', isolation_level=None)
或者这样做:
conn = sqlite3.connect('test.db')
conn.isolation_level = None
查看文档和源码,isolation_level=None的作用:sqlite3模块在开始执行某些SQL语句之前,不再(智能地)自动BEGIN一个事务、或自动COMMIT上一个事务。用户须手动BEGIN一个事务、手动COMMIT之前的修改。
此时(isolation_level=None)程序完全遵照SQLite引擎的行为:在事务以外执行一条SQL语句之后,会立刻COMMIT修改。
尽管sqlite3模块默认的“傻瓜模式”在绝大多数情况下工作良好,个人还是推荐尽量使用isolation_level=None,原因有三:
在个别复杂情况下,傻瓜模式有陷阱,不了解的人容易陷进去。见issue 10740的讨论。
sqlite3模块更透明,sqlite3引擎更简洁。喜欢这种风格。
同一代码在所有版本的Python 3都行得通。
一执行就出现异常:
Traceback (most recent call last):
File "D:\desktop\cannot_vacuum.py", line 25, in <module>
conn.execute('VACUUM')
sqlite3.OperationalError: cannot VACUUM from within a transaction
这是因为在真正执行VACUUM之前,Python 3.6.0的sqlite3模块(自作主张地)添加了一条BEGIN语句创建了一个事务,而VACUUM不能在事务中执行。
在Python 3.6.0,要想让程序正常运行,需要在connect时设置isolation_level参数为None,如下:
conn = sqlite3.connect('test.db', isolation_level=None)
或者这样做:
conn = sqlite3.connect('test.db')
conn.isolation_level = None
查看文档和源码,isolation_level=None的作用:sqlite3模块在开始执行某些SQL语句之前,不再(智能地)自动BEGIN一个事务、或自动COMMIT上一个事务。用户须手动BEGIN一个事务、手动COMMIT之前的修改。
此时(isolation_level=None)程序完全遵照SQLite引擎的行为:在事务以外执行一条SQL语句之后,会立刻COMMIT修改。
尽管sqlite3模块默认的“傻瓜模式”在绝大多数情况下工作良好,个人还是推荐尽量使用isolation_level=None,原因有三:
在个别复杂情况下,傻瓜模式有陷阱,不了解的人容易陷进去。见issue 10740的讨论。
sqlite3模块更透明,sqlite3引擎更简洁。喜欢这种风格。
同一代码在所有版本的Python 3都行得通。
相关文章推荐
- Python中的sqlite模块无法导入的解决方案
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- python 执行javascript 模块 支持 python3
- 错误 执行Transact-SQL语句批处理时发生了异常。无法设置主体'sa'的凭据
- 错误 执行Transact-SQL语句批处理时发生了异常。无法设置主体'sa'的凭据
- python控制语句的执行顺序
- python 学习记录(6)-模块导入/变量/常量/注释/语句分隔
- python中使用time模块计算代码执行效率的精度测试
- python下paramiko模块学习之一:ssh登录和执行命令
- 利用python fabric模块写的批量操作远程主机脚本(命令执行,上传、下载文件)
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- Python动态执行语句 Executable Object Statement and Built-in Functions
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- 无法在SQL 2005系统数据库中执行的T-SQL语句(XML处理)
- 无法在SQL2005系统数据库中执行的T-SQL语句(XML处理)
- python无法在模块路径中找到主题引擎:“pixmap”
- python perl脚本经过cvs提交后无法直接执行解决