如何在导入函数中使用MySQLdb连接对象

1 投票
2 回答
2326 浏览
提问于 2025-04-17 12:36

这是个新手问题。我尝试把一些常用的代码放到一个单独的模块里,然后作为一个导入的函数来使用。这段代码通过MySQLdb进行MySQL查询。当这个函数在主脚本里时,它运行得很好。但是当我从一个单独的模块导入这个函数时,它就失败了,因为光标对象不再被定义了。有没有办法导入函数而不需要为这个导入的函数单独定义一个光标对象呢?

下面是一个代码示例。这段代码可以正常工作:

import MySQLdb
#from mod2 import lookup_value

def get_db_connection(database_name):
    db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name)
    cur = db.cursor()
    return db, cur

def lookup_value(user_name):
    query = "SELECT COUNT(*) FROM x_user_%s" % (user_name)
    cur.execute("%s" % (query))
    return cur.fetchone()

db_name = 'mg_test' # database name
user_name = 'test' # name of a specific table in the database

db, cur = get_db_connection(db_name)
value = lookup_value(user_name)

当我把lookup_value的代码移动到第二个文件,并导入它('from mod2 import lookup_value')时,代码就失败了,因为光标对象没有定义。导入的lookup_value版本只有在我为它创建一个光标对象时才能工作。这看起来很低效。处理这个问题的最佳方法是什么呢?

2 个回答

1

如果你想让你的函数互不影响,就应该给它们传递一个光标变量。无论如何,在函数里你只应该使用局部变量和作为参数传入的变量。

3

这是因为 lookup_value 会在你导入的文件中查找 cur。你可以把这些内容放在一个类里面。

class DB():
    def __init__(self,database_name):
        db = MySQLdb.connect('localhost', 'user', 'pswrd', database_name)
        self.cur = db.cursor()


    def lookup_value(self,user_name):
        query = "SELECT COUNT(*) FROM x_user_%s"
        self.cur.execute(query, (user_name,))
        self.result = self.cur.fetchone()
        return self.result

现在你可以这样做

....
db = DB(db_name)
value = db.lookup_value(user_name)

当你导入数据库时,使用 from mod2 import DB,最后的部分应该仍然可以正常工作。

另外,注意我在 lookup_value 中是如何执行查询的,这样可以确保数据是经过清理的。

撰写回答