我有一个奇怪的问题,可能很容易解决。
我有一个包含__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中,因此它应该调用正确的模块。
如果有人有想法,那就非常受欢迎了。
答案 0 :(得分:3)
你的路径中有另一个Database
模块或包,而是导入它。
要诊断其他模块的居住地,请添加:
import Database
print Database.__file__
在from Database import Database
行之前;它会打印模块的文件名。您必须将一个或另一个模块重命名为不冲突。
答案 1 :(得分:1)
如果您想在搜索路径中首先插入({1}},则应插入(不附加):
sys.path
答案 2 :(得分: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)
是这样做的方法。
抱歉,这应该是一个评论,但答案允许更好的格式。我知道它没有回答你的问题......
答案 3 :(得分:0)
我不太确定会出现什么问题,但您可以尝试将数据库对象作为参数传递给函数
db_functions.test(db, 12)
,db是您的数据库类