在 pysqlite 中使用 "with" 上下文管理器
Using a "with" contextmanager with pysqlite
我正在尝试使用 "with" contextmanager pysqlite:
>>> with conn.cursor() as db:
res = db.execute("SELECT * FROM Publishers LIMIT 5;").fetchall()
... ... Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __enter__
我看到 __enter__
和 __exit__
方法未定义,因此 with
contextmanager 将不可用。
我还从 pysqlite 文档中了解到,sqlite3 在连接方面有点古怪。一般来说,我更喜欢将上下文管理器与每个惯用 python 数据库 API 一起使用 python.
这是否表明我/不应该/尝试重载并实现上下文管理器?在 sqlite3 绑定中有什么东西使这不可取或不惯用?
这是否意味着正确的用法是将我的光标仅实例化一次 (db = conn.cursor()
) 作为全局变量并在我的每个函数中调用它 (db.execute(query,params)
)?或者我必须在每个函数中重新实例化、调用和关闭数据库(db = conn.cursor(); db.query(query,params); db.close()
并且这样做很冗长,缺少上下文管理器?
根据 documentation,您使用 连接 作为上下文管理器 (with conn as db:
),而不是 连接的游标 (with conn.cursor() as db:
):
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("create table person (id integer primary key, firstname varchar unique)")
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
# con.rollback() is called after the with block finishes with an exception, the
# exception is still raised and must be caught
try:
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
print "couldn't add Joe twice"
我正在尝试使用 "with" contextmanager pysqlite:
>>> with conn.cursor() as db:
res = db.execute("SELECT * FROM Publishers LIMIT 5;").fetchall()
... ... Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: __enter__
我看到 __enter__
和 __exit__
方法未定义,因此 with
contextmanager 将不可用。
我还从 pysqlite 文档中了解到,sqlite3 在连接方面有点古怪。一般来说,我更喜欢将上下文管理器与每个惯用 python 数据库 API 一起使用 python.
这是否表明我/不应该/尝试重载并实现上下文管理器?在 sqlite3 绑定中有什么东西使这不可取或不惯用?
这是否意味着正确的用法是将我的光标仅实例化一次 (db = conn.cursor()
) 作为全局变量并在我的每个函数中调用它 (db.execute(query,params)
)?或者我必须在每个函数中重新实例化、调用和关闭数据库(db = conn.cursor(); db.query(query,params); db.close()
并且这样做很冗长,缺少上下文管理器?
根据 documentation,您使用 连接 作为上下文管理器 (with conn as db:
),而不是 连接的游标 ():with conn.cursor() as db:
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("create table person (id integer primary key, firstname varchar unique)")
# Successful, con.commit() is called automatically afterwards
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
# con.rollback() is called after the with block finishes with an exception, the
# exception is still raised and must be caught
try:
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
print "couldn't add Joe twice"