Автоматически закрывать базу данных в sqlite3 из Python - PullRequest
1 голос
/ 27 мая 2020

В 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

Есть ли проблема в приведенном выше коде? Есть ли лучшее решение?

...