繁体   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