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版本仅在我创建游标对象供其使用时才有效。这看起来非常低效。处理这个问题的最佳方法是什么?
答案 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)
如果希望它们独立,则应将游标变量传递给函数。 在任何情况下,您都应该在函数中仅使用局部变量和作为参数传递的变量。