В Python sqlite3 диспетчер контекста
with sqlite3.connect(database)
автоматически фиксирует или откатывает транзакции. Однако он не закрывает ни соединение, ни курсор. Поэтому каждый раз, когда мне приходится писать что-то вроде этого:
with sqlite3.connect(database) as conn:
cur = conn.cursor()
cur.execute(an_sql_statement)
cur.executemany(more_sql_statements)
cur.close()
conn.close()
, что становится довольно повторяющимся.
Я хочу иметь возможность сделать что-то вроде этого:
with AutoCloseDB(database) as cur:
cur.execute(an_sql_statement)
cur.executemany(more_sql_statements)
и вышеупомянутый диспетчер контекста автоматически фиксирует или откатывает транзакции, закрывает курсор и, наконец, полностью закрывает базу данных при выходе.
Итак, я придумал следующий диспетчер контекста:
import sqlite3
class AutoCloseDB:
"""A context manager that automatically closes the cursor and the database.
Return a cursor object upon entering.
"""
def __init__(self, database):
self.conn = sqlite3.connect(database)
def __enter__(self):
self.conn = self.conn.__enter__()
self.cur = self.conn.cursor()
return self.cur
def __exit__(self, *exc_info):
result = self.conn.__exit__(*exc_info)
self.cur.close()
self.conn.close()
return result
Есть ли проблема в приведенном выше коде? Есть ли лучшее решение?