gpt4 book ai didi

python - 在 python 类之间共享 python MySQL 连接对象

转载 作者:行者123 更新时间:2023-11-30 22:54:40 25 4
gpt4 key购买 nike

我使用 python 的 MySQLdb 连接到数据库并获取不同的值。

主类需要数据库中的一些值。为了获得这个值,我正在编写单独的类。但是在每个类(class)中,我再次需要来自 db 的不同值。所以我再次需要连接到数据库并获取值。这似乎不是优雅的解决方案。

1) 在类之间共享 mysql 连接的最佳方法是什么?比直接传递连接实例或针对这种情况的任何众所周知的模式更通用的东西?

2) 我们是否需要为每个查询创建新的游标对象?或者一个就够了。

更新:如果我使用 singleton 或 borg 模式只创建一个连接实例,结果如何。还是像 sqlalchemy 那样尝试 ORM?

考虑以下例子。 “主要”类取决于“Foo”和“Bar”。这三个都需要连接数据库以获得某些值。

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

提前致谢。

最佳答案

你可以创建一个 db 类,它有一个 self.dbconn = MySQLdb.connect(...) 作为成员,并让它回答年龄、姓名等的查询。这样你就可以为你的所有对象使用相同的 dbconn 对象查询。您还可以为不同的查询重用游标对象。

为了真正完美,您还可以在 db 类上指定一个 del 方法以在销毁时关闭连接。 (也检查这个 discussion )

关于python - 在 python 类之间共享 python MySQL 连接对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26950528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com