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