在Python中关闭SQLite3连接(当连接是对象的一部分时)

时间:2012-10-01 19:39:59

标签: oop database-design sqlite python-3.x cursor

我整晚都试图找到这个问题的答案,但我仍然没有得到明确的答案。通常当我使用sqlite3时,我会使用以下模式:

import sqlite3

db = sqlite3.connect('whatever.db')
cursor = db.cursor()

#do some stuff

cursor.close()

现在我试图发展我对OOP和数据库的理解,所以我想我会创建一个控制器对象来与数据库进行交互。我想出了以下内容:

只定义连接和游标的类:

import sqlite3

class coffee_shop_controller:

    def __init__(self):
        self.db = sqlite3.connect("coffeeshop.db")
        self.cursor = self.db.cursor()

    def close(self):
        self.cursor.close()

我将其子类化为我需要的各种控制器。例如:

class customer_controller(coffee_shop_controller):

    """creates a controller to add/delete/amend customer records in the
       coffee shop database"""

    def __init__(self):
        super().__init__()

    def add_customer(self,fn,ln,sa,t,pc,tn):
        sql = """insert into customer
                 (first_name,last_name,street_address,town,post_code,telephone_number)
                 values
                 ('{0}','{1}','{2}','{3}','{4}','{5}')""".format(fn,ln,sa,t,pc,tn)
        self.cursor.execute(sql)
        self.db.commit()

我很欣赏设计模式可能不太好(对建议持开放态度)并且我确实应该阻止SQL注入,但是关闭连接我现在很有意思。

通过搜索Python docs注释行表明我们 可以 关闭连接,而不是我们 必须 即可。这是正确的吗?我真的不需要打扰吗?

如果我确实需要打扰,那么我应该做的事情似乎有分歧:

这里有什么确定的吗? __del__方法对我来说最有意义,但也许这是我无知的谈话。

感谢您提供的任何建议。

亚当。

1 个答案:

答案 0 :(得分:0)

释放您不再需要的资源是一种很好的做法。通常情况下,数据库连接非常“昂贵”,我肯定会建议打开连接,执行实际查询并在此之后立即关闭连接。

为了更好地控制这一点,我还建议您遵循工作单元设计模式。此外,如果您可以将工作单元与一些优秀的 ORM (例如SQLAlchemy或Django)结合起来,那将非常适合您