Вы можете создать модуль подключения, поскольку модули сохраняют один и тот же объект во всем приложении и регистрируют функцию, чтобы закрыть его с помощью модуля atexit
# db.py:
import sqlite3
import atexit
con = None
def get_connection():
global con
if not con:
con = sqlite3.connect('somedb.sqlite')
atexit.register(close_connection, con)
return con
def close_connection(some_con):
some_con.commit()
some_con.close()
# your_program.py
import db
con = db.get_connection()
cur = con.cursor()
cur.execute("SELECT ...")
Это предложение основано на предположении, что соединение в вашем приложении выглядит как один экземпляр (singleton), который хорошо обеспечивает глобальный модуль.
Если это не так, то вы можете использовать деструктор.
Однако деструкторы не подходят для сборщиков мусора и циклических ссылок (вы должны удалить циклическую ссылку самостоятельно, прежде чем вызывается деструктор), и если это не так (вам нужно несколько соединений), тогда вы можете обратиться к деструктору. Только не держите круговые ссылки рядом, иначе вам придется их сломать.
Кроме того, то, что вы сказали о C ++, неверно. Если вы используете деструкторы в C ++, они вызываются либо по завершении блока, определяющего объект (например, with
в python), либо когда вы используете ключевое слово delete
(которое освобождает объект, созданный с помощью new
). Вне этого вы должны использовать явный close()
, который не является деструктором. Так что это как python - python даже «лучше», потому что у него есть сборщик мусора.