records库使用sqlite数据库Cannot operate on a closed database错误解决

Python的 records 库使用起来特别方便,对 RedShift, Postgres, MySQL, SQLite, Oracle, 和 MS-SQL 都提供支持。但最近在测试 records 操作 sqlite 数据库的时候,却出现一个莫名的错误。代码只有 4 行,是这样的:

import records 

db = records.Database('sqlite:///testdb.db')
rows = db.query('select * from users')
print (rows.dataset)

运行报如下错误:

sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) Cannot operate on a closed database.

按理说 records 自动管理数据库的连接,自动管理数据连接的打开和关闭,为什么会出现数据库关闭呢。跟踪了一下代码,发现原因是这样的。

records 库的 Database 对象在 __init__() 方法中调用 sqlalchemy 库的 create_engine() 方法,并且将 open 属性设为 True。


然后 Databasequery() 方法中,先调用 Database.get_connection() 方法,返回一个 Connection 对象,再执行 Connection 对象的 query() 方法。

但是 Connection 类有一个 __exit__() 方法,我们知道,Python 的 __enter__() 方法和 __exit__() 方法是实现上下文管理的,所以有 with 语句,Connection 对象执行完 query() 方法后,会自动调用 __exit__() 方法,将 connection 关闭了。这个就是错误的原因。


知道原因,解决办法也就简单了,直接调用 Connection 对象的 query() 方法,将代码修改如下:

import records 

db = records.Database('sqlite:///testdb.db')
conn = db.get_connection()

rows = conn.query('select * from users')
print (rows.dataset)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值