有没有 "with conn.cursor() as..." 的方式来使用 Sqlite?

Is there a "with conn.cursor() as..." way to work with Sqlite?

而不是使用:

import sqlite3
conn = sqlite3.connect(':memory:')
c = conn.cursor()
c.execute(...)
c.close()

是否可以使用 Pythonic 习语:

with conn.cursor() as c:
    c.execute(...)

好像不行:

AttributeError: __exit__

注意:关闭游标很重要,因为

一个更简单的替代方法是将连接对象与上下文管理器一起使用,如 docs 中指定的那样。

with con:
    con.execute(...)

如果您坚持使用游标(出于某些原因),那么为什么不制作自己的包装器class?

class SafeCursor:
    def __init__(self, connection):
        self.con = connection

    def __enter__(self):
        self.cursor = self.con.cursor()
        return self.cursor

    def __exit__(self, typ, value, traceback):
        self.cursor.close()

然后您可以这样称呼您的 class:

with SafeCursor(conn) as c:
    c.execute(...)

您可以使用 contextlib.closing:

import sqlite3
from contextlib import closing

conn = sqlite3.connect(':memory:')

with closing(conn.cursor()) as cursor:
    cursor.execute(...)

这是有效的,因为 closing(object) 在 with 块之后自动调用传入对象的 close() 方法。

添加到 。我最近遇到了 INSERT 语句未提交到数据库的问题。原来我只缺少 Connection 对象的 with 上下文管理器。
此外,如 .
中所述,始终关闭 Cursor 对象也是一个好习惯。 因此,使用两个 contextlib.closing() 方法,每个方法都在一个 with 上下文管理器中:

import contextlib
import sqlite3

# Auto-closes the Connection object
with contextlib.closing(sqlite3.connect("path_to_db_file")) as conn:
    # Auto-commit to the database
    with conn:
        # Auto-close the Cursor object
        with contextlib.closing(conn.cursor()) as cursor:
            # Execute method(s)
            cursor.execute(""" SQL statements here """)