簡體   English   中英

在不重復連接部分的情況下,設計 Python / SQLite 應用程序的正確方法是什么?

[英]What is the right way to design Python / SQLite application without repeating connection part?

我正在嘗試開發一個簡單的應用程序,將多個業務對象保存到 sqlite 數據庫中。 我有幾個要編寫保存/更新/刪除方法的業務對象。 對於這些類中的每個類和方法,我總是創建一個新連接。 例如:

import sqlite3
db = "mydb.db"

class BusinessObject1:
    ...
    def save_to_db(self, db):
        conn = sqlite3.connect(db)
        cur = conn.cursor()
        with conn:
            cur.execute("...")

    def delete_from_db(self, db):
        conn = sqlite3.connect(db)
        cur = conn.cursor()
        with conn:
            cur.execute("...")

class BusinessObject2:
    ...
    def save_to_db(self, db):
        conn = sqlite3.connect(db)
        cur = conn.cursor()
        with conn:
            cur.execute("...")

    def delete_from_db(self, db):
        conn = sqlite3.connect(db)
        cur = conn.cursor()
        with conn:
            cur.execute("...")
        

它感覺不是一個好的設計解決方案(不是 DRY)。 有人可以為此提出更好的設計嗎? 我有大約 20 個業務對象和 4-8 個方法,以及一個包含所有這些對象的記錄表。 每次都輸入 conn=sqlite3.connect(db) 根本不可能是正確的方法。 如果我決定更改為 MySQL 或 PostgreSQL,我將需要重構整個項目。

謝謝!

然后,您可能希望將連接處理程序與 class object 分開,或者您可以按照上面的評論建議將連接放在 class 構造函數中。

如果由於某種原因你不能同時做這兩個你仍然可以添加一個靜態方法到你的 class 來處理連接。 這並不理想,但仍然比您的解決方案更好:

@staticmethod
def create_connection(db_file):

    conn = None

    try:
        with sqlite3.connect(db_file) as conn:
            return conn
    except sqlite3.Error as e:
        print("Can't connect to database, error:", e, sep="\n")

    return conn

然后你添加一個參數到你的其他方法,這里是connection

def save_to_db(self, connection):
        cur = connection.cursor()
        cur.execute("...")

這樣,您可以將 object 與 class object 分開:

if __name__ == "__main__":
    conn = BusinessObject1.create_connection(db)

    b1 = BusinessObject1(...)
    b1.save_to_db(conn)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM