如何在课堂上关闭SQLite 3数据库? [已关闭]

问题描述 投票:0回答:1

我最近开始探索数据库。我无法解决任务:我有一个类可以在我的数据库(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)
python sqlite
1个回答
0
投票

这看起来不错,但可以改进。我会建议您更正 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()
© www.soinside.com 2019 - 2024. All rights reserved.