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

时间:2012-02-08 16:59:29

标签: python mysql-python

Noobish问题可以肯定。我试图将一些常用代码移动到一个单独的模块中,并将代码用作导入的函数。该代码通过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 个答案:

答案 0 :(得分: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中执行查询,以确保数据已清理

答案 1 :(得分:1)

如果希望它们独立,则应将游标变量传递给函数。 在任何情况下,您都应该在函数中仅使用局部变量和作为参数传递的变量。