我最近开始探索数据库。我无法解决任务:我有一个类可以在我的数据库(SQLite 3)中进行更改。我不知道如何正确关闭数据库连接。这是最佳且正确的吗?
class DBConnection:
def __enter__(self):
self.conn = sqlite3.connect('main.db')
self.cursor = self.conn.cursor()
return self.cursor
def __exit__(self):
if self.cursor:
self.cursor.close()
if self.conn:
self.conn.close()
def db_connection(func):
def wrapper(*args, **kwargs):
with DBConnection() as cursor:
return func(cursor, *args, **kwargs)
return wrapper
class Database:
@db_connection
def some_query(self, cursor, args):
cursor.execute(query)
这看起来不错,但可以改进。我会建议您更正 exit 方法,因为 DBConnection 类的方法接受三个附加参数 (exc_type, exc_val, exc_tb) 发生异常时由 with 语句传递。 另请注意,为了确保在关闭连接之前保存更改,您需要在关闭连接之前添加提交
这是根据您的示例修改的代码。
import sqlite3
class DBConnection:
def __enter__(self):
self.conn = sqlite3.connect('main.db')
self.cursor = self.conn.cursor()
return self.cursor
def __exit__(self, exc_type, exc_val, exc_tb):
if self.cursor:
self.cursor.close()
if self.conn:
if exc_type is None:
self.conn.commit() # this is to commit if no exception
self.conn.close()
return False
def db_connection(func):
def wrapper(*args, **kwargs):
with DBConnection() as cursor:
return func(cursor, *args, **kwargs)
return wrapper
class Database:
@db_connection
def some_query(self, cursor, *args):
query = "YOUR SQL QUERY HERE"
cursor.execute(query)
这是一个示例用法
db = Database()
db.some_query()