簡體   English   中英

在python類之間共享python MySQL連接對象

[英]Sharing python MySQL connection object between python classes

使用python的MySQLdb,我連接到數據庫並獲取不同的值。

主類需要來自數據庫的值的數量。 為了獲得此值,我正在編寫單獨的類。 但是在每個類中,我再次需要與db不同的值。 因此,我再次需要連接數據庫並獲取值。 這似乎不是優雅的解決方案。

1)在類之間共享mysql連接的最佳方法是什么? 比直接傳遞連接實例或這種情況下的任何眾所周知的模式更通用嗎?

2)每個查詢是否都需要新的游標對象? 或單一個就足夠了。

更新:如果我使用單例或borg模式僅創建一個連接實例,該如何進行。 還是像sqlalchemy一樣給ORM開槍?

考慮以下。 “主要”類取決於“ Foo”和“ Bar”。 所有這三個需要連接db以獲得某些值。

class Bar(object):
    def __init__(self):
        self.host = "127.0.0.1"
    self.username = 'foo'
    self.passwd = 'bar'
    self.dbname = 'foobar'

    def getAge(self, id, name):
        query = ...
        conn = MySQLdb.connect(self.host, self.username, self.passwd, self.dbname)
        cursor = conn.cursor()
        cursor.excute(query)
        result = cursor.fetchone()
        age = result[0]
        cursor.close()
        del cursor
        conn.close()
        return age 


class Foo(object):
    def __init__(self):
        self.host = "127.0.0.1"
    self.username = 'foo'
    self.passwd = 'bar'
    self.dbname = 'foobar'

    def getName(self, id):
        query = ...
        conn = MySQLdb.connect(self.host, self.username, self.passwd, self.dbname)
        cursor = conn.cursor()
        cursor.excute(query)
        result = cursor.fetchone()
        name = result[0]
        cursor.close()
        del cursor
        conn.close()
        return name 


class Main(object):
    def __init__(self):
        self.host = "127.0.0.1"
    self.username = 'foo'
    self.passwd = 'bar'
    self.dbname = 'foobar'

    def connect(self):
        self.conn = MySQLdb.connect(self.host, self.username, self.passwd, self.dbname)

    def getId(self):
        query = ...
        cursor = self.conn.cursor()
        cursor.excute(query)
        result = cursor.fetchone()
        name = result[0]
        cursor.close()
        del cursor
        return id 

    def process(self):
        self.connect()
        id = self.getId()
        name = Foo().getName(id)
        age = Bar().getAge(id, name)
        self.conn.close()
        print id, name, age

提前致謝。

您可以創建一個具有self.dbconn = MySQLdb.connect(...)作為成員的db類,並使其回答有關Age,Name等的查詢。因此,對於所有查詢都使用相同的dbconn對象。 您還可以將游標對象重用於不同的查詢。

確實,您還可以在db類上指定一個del方法來關閉銷毀連接。 (也請查看此討論

您只需要在每個類中重復相同的代碼即可。 您可以創建一個基類來封裝查詢連接管道和執行邏輯,然后使用此方法(繼承)。 或者,創建一個單獨的包含邏輯的類,並使用它的一個實例(組成)。

暫無
暫無

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

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