0

我有一个奇怪的问题,这可能很容易解决。

我有一个类数据库,其中包含一个__init__和一个executeDictMore方法(等等)。

class Database():
    def __init__(self, database, server,login, password ):
        self.database = database
        my_conv = { FIELD_TYPE.LONG: int }
        self.conn = MySQLdb.Connection(user=login, passwd=password, db=self.database, host=server, conv=my_conv)
        self.cursor = self.conn.cursor()

    def executeDictMore(self, query):
        self.cursor.execute(query)
        data = self.cursor.fetchall()
        if data == None :
            return None
        result = []
        for d in data:
            desc = self.cursor.description
            dict = {}
            for (name, value) in zip(desc, d) :
                dict[name[0]] = value
            result.append(dict)
        return result

然后我在文件 db_functions.py 中实例化这个类:

from Database import Database
db = Database()

我从 db_functions 的函数调用 executeDictMore 方法:

def test(id):
    query = "SELECT * FROM table WHERE table_id=%s;" %(id)
    return db.executeDictMore(query)

现在是奇怪的部分。如果我导入 db_functions 并从 python 控制台调用 db_functions.test(id) :

import db_functions
t = db_functions.test(12)

它工作得很好。但是,如果我从另一个 python 文件做同样的事情,我会收到以下错误:

AttributeError: Database instance has no attribute 'executeDictMore'

我真的不明白这里发生了什么。我不认为我有另一个数据库类干扰。我在 sys.path 中附加了模块所在的文件夹,因此无论如何它都应该调用正确的模块。

如果有人有想法,非常欢迎。

4

4 回答 4

3

您的路径中有另一个Database模块或包,它正在被导入。

要诊断其他模块所在的位置,请添加:

import Database
print Database.__file__

行前from Database import Database;它将打印模块的文件名。您必须重命名一个或另一个模块以免冲突。

于 2013-08-13T09:01:38.110 回答
1

sys.path如果您想在搜索路径中首先插入(而不是附加)到您的:

sys.path.insert(0, '/path/to/your/Database/class')
于 2013-08-13T09:02:42.590 回答
1

您至少可以尝试避免 SQL 注入。Python 提供了这样简洁的方法:

def executeDictMore(self, query, data=None):
    self.cursor.execute(query, data)

def test(id):
    query = "SELECT * FROM table WHERE table_id=%s"
    return db.executeDictMore(query, id)

是这样做的方法。

抱歉,这应该是评论,但答案可以更好地格式化。我知道它没有回答你的问题......

于 2013-08-13T09:07:42.997 回答
0

我不太确定出了什么问题,但是您可以尝试将数据库对象作为参数传递给函数,例如 db_functions.test(db, 12)db 是您的数据库类

于 2013-08-13T08:57:30.280 回答