2012-10-01 125 views
0

我一直試圖找到這個問題的答案整晚,我仍然沒有遇到明確的答案。在Python中關閉SQLite3連接(當連接是對象的一部分時)

import sqlite3 

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

#do some stuff 

cursor.close() 

現在,我想我的發展OOP的理解和數據庫,所以我想我會創建一個控制器對象來與數據庫進行交互:通常當我用sqlite3的工作,我會用以下模式。我想出了以下情況:

一類只是定義了連接和光標:

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__方法對我最有意義,但也許這就是我的無知說話。

感謝您提供任何建議。

亞當。

回答

0

這是一個很好的做法,可以釋放不再需要的資源。通常,數據庫連接非常「昂貴」,我肯定會建議打開連接,然後執行實際查詢並關閉連接。

爲了實現對此的更好控制,我還建議遵循工作單元的設計模式。此外,這將是偉大的你,如果你可以用一些好的ORM(如SQLAlchemy的或Django的)

+0

感謝,結合組的工作。 –