毫无疑问,这是一个不明智的问题。我尝试将一些常见的代码移动到一个单独的模块中,并将这些代码用作导入的函数。这段代码通过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版本才起作用。这似乎非常低效。处理此问题的最佳方法是什么?
发布于 2012-02-09 01:41:59
这是因为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)当您导入DB from mod2 import DB时,最后一部分应该仍然有效。
还要注意我是如何在lookup_value中执行查询的,这确保了数据的完整性
发布于 2012-02-09 01:02:10
如果希望函数是独立的,则应将游标变量传递给函数。在任何情况下,您都应该在函数中只使用局部变量和作为参数传递的变量。
https://stackoverflow.com/questions/9197936
复制相似问题