【问题标题】:How do I use a MySQLdb connect object on imported function如何在导入的函数上使用 MySQLdb 连接对象
【发布时间】:2012-02-08 16:59:28
【问题描述】:

可以肯定的问题。我试图将一些通用代码移动到一个单独的模块中,并将该代码用作导入函数。该代码通过 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 的导入版本仅在我创建一个游标对象供其使用时才有效。这似乎非常低效。处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: python mysql-python


    【解决方案1】:

    那是因为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 中执行查询的,这样可以确保数据被净化

    【讨论】:

    • 当我完成为我的项目编写代码后,我期待真正学习 python。我不太确定我是否希望重写它,但是:) 谢谢
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2022-01-24
      • 1970-01-01
      • 2015-11-01
      • 2013-07-14
      • 2014-05-25
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多