使用python的MySQLdb我连接到数据库并获取不同的值。
主类需要数据库中的值数。为了获得这个值,我正在编写单独的类。但是在每个班级中,我再次需要db的不同值。所以我再次需要连接数据库和获取值。这似乎不是优雅的解决方案。
1)在类之间共享mysql连接的最佳方法是什么?比直接传递连接实例或任何众所周知的模式更通用的东西?
2)我们是否需要为每个查询添加新的游标对象?或单一就足够了。
更新: 如果我使用singleton或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
提前致谢。
答案 0 :(得分:0)
你可以创建一个拥有self.dbconn = MySQLdb.connect(...)作为成员的db类,并让它回答Age,Name等的查询。那么你就可以使用相同的dbconn对象了查询。您还可以将光标对象重用于不同的查询。
为了非常完美,您还可以在db类上指定 del 方法以关闭销毁时的连接。 (另请查看此discussion)
答案 1 :(得分:0)
您只是在每个班级重复相同的代码。您可以创建一个基类来封装查询连接管道和执行逻辑,并使用此方法(继承)。或者,创建一个包含逻辑的单独类,并使用它的一个实例(组合)。