0

私は一晩中この質問に対する答えを見つけようとしてきましたが、まだ明確な答えに出くわしていません. 通常、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__方法は私にとって最も理にかなっていますが、それは私の無知の話かもしれません。

あなたが提供できる提案をありがとう。

アダム。

4

1 に答える 1

0

不要になったリソースを解放することをお勧めします。通常、データベース接続はかなり「高価」であり、接続を開いて実際のクエリを実行し、その後すぐに接続を閉じることをお勧めします。

これをより適切に制御するために、Unit Of Work設計パターンに従うこともお勧めします。さらに、 Unit Of Workをいくつかの優れたORM (SQLAlchemy や Django など)と組み合わせることができれば、それはあなたにとって素晴らしいことです。

于 2012-10-01T19:59:31.767 に答える