[英]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.