有没有 "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 """)
而不是使用:
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 """)