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

时间:2014-11-15 20:44:09

标签: python mysql database

使用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

提前致谢。

2 个答案:

答案 0 :(得分:0)

你可以创建一个拥有self.dbconn = MySQLdb.connect(...)作为成员的db类,并让它回答Age,Name等的查询。那么你就可以使用相同的dbconn对象了查询。您还可以将光标对象重用于不同的查询。

为了非常完美,您还可以在db类上指定 del 方法以关闭销毁时的连接。 (另请查看此discussion

答案 1 :(得分:0)

您只是在每个班级重复相同的代码。您可以创建一个基类来封装查询连接管道和执行逻辑,并使用此方法(继承)。或者,创建一个包含逻辑的单独类,并使用它的一个实例(组合)。