1

我想从数据库“详细信息”中检索值,因为我只想与 DB 创建一个连接,如果连接存在,则不要建立新连接并继续前一个连接。为此,我尝试了以下方法:

import MySQLdb
import re
import os

class Find:

    def __init__(self,addr):
        self.addr = addr


    dsn = {
    'username': 'xyz',
    'password': 'xyz',
    'hostname': 'localhost',
    'database': 'details'
    }
    the_database_connection = False

    def connect(self,dsn):
        '''This function saves the database connection, so if invoke this again, it gives you the same one, rather than making a second connection.'''
        global the_database_connection
        if not the_database_connection:
            try:
                the_database_connection = MySQLdb.connect(
                    host=dsn['hostname'],
                    user=dsn['username'],
                    passwd=dsn['password'],
                    db=dsn['database'])
            # so modifications take effect automatically
                the_database_connection.autocommit(True)
            except MySQLdb.Error, e:
                print ("Couldn't connect to database. MySQL error %d: %s" %(e.args[0], e.args[1]))
        return the_database_connection
        x=conn.cursor()
        sql = "select * from persons where address = %s" % addr
        x.execute(sql)
        rows = x.fetchall()
        for row in rows:
            print row

if __name__ == "__main__":
    a = Find(addr = "new street")
    a.connect()

但这显示错误:a.connect 需要 2 个参数,一个是定义...我如何定义上述 dsn。

4

2 回答 2

0

您正在尝试重新发明连接池。

不幸的是,您的解决方案无法按原样工作。只有当所有连接参数(主机、端口、数据库、用户名、密码)完全相同时,才能使用相同的连接。在您的情况下,您在任何情况下都返回相同的连接,这是完全错误的 - 如果任何属性不同,您必须创建新连接。

相反,只需使用现有的连接池库之一,例如pysqlpoolDBUtils(我相信还有其他的)。

于 2012-12-17T07:24:54.070 回答
0

您没有按要求向 a.connect 函数提供 dsn 信息。将 dsn 信息拉出类并使其成为主要功能的一部分。然后将其作为 a.connect 的参数反馈回来。像这样:

import MySQLdb
import re
import os

class Find:

    def __init__(self,addr):
        self.addr = addr

    def connect(self,dsn):
        '''This function saves the database connection, so if invoke this again, it     gives you the same one, rather than making a second connection.'''
        global the_database_connection
        if not the_database_connection:
            try:
                the_database_connection = MySQLdb.connect(
                    host=dsn['hostname'],
                    user=dsn['username'],
                    passwd=dsn['password'],
                    db=dsn['database'])
                # so modifications take effect automatically
                the_database_connection.autocommit(True)
            except MySQLdb.Error, e:
                print ("Couldn't connect to database. MySQL error %d: %s" %(e.args[0], e.args[1]))
        return the_database_connection
        x=conn.cursor()
        sql = "select * from persons where address = %s" % addr
        x.execute(sql)
        rows = x.fetchall()
        for row in rows:
            print row

if __name__ == "__main__":
    a = Find(addr = "new street")
    dsn = {
    'username': 'xyz',
    'password': 'xyz',
    'hostname': 'localhost',
    'database': 'details'
    }
    the_database_connection = False
    a.connect(dsn)
于 2012-12-17T09:19:30.560 回答