Python数据库更新错误

时间:2012-09-29 08:31:42

标签: python mysql database

通常我使用Django orm在python中进行数据库相关的查询,但现在我正在使用python本身

我正在尝试更新我的mysql数据库的一行

query ='UPDATE callerdetail SET upload="{0}" WHERE agent="{1}" AND custid="{2}"AND screenname="{3}" AND status="1"'.format(get.uploaded,get.agent,get.custid,get.screenname)

但是我收到了错误

query ='UPDATE callerdetail SET upload="{0}" WHERE agent="{1}" AND custid="{2}"AND screenname="{3}" AND status="1"'.format(get.uploaded,get.agent,get.custid,get.screenname)

AttributeError:'C'对象没有'已上传'属性

请帮我查询我的查询有什么问题?

2 个答案:

答案 0 :(得分:0)

Get可能映射到c对象。尝试将“get”对象重命名为其他对象。

以下是reserved words的列表。我没有看到进入那里,但听起来它可能是包含在c库中的一部分。如果您在 x import * 中添加了某些内容,则无需了解就可以导入。

答案 1 :(得分:0)

简而言之 - get可能不是你想象的那样。

但是,在您使用字符串格式进一步构建SQL查询之前,我强烈建议您不要这样做!搜索“SQL注入”,你会明白为什么。符合Python DB API的库使用“占位符”,库可以使用它将变量插入到查询中,为您提供任何必要的转义/引用。

所以而不是:

query ='UPDATE callerdetail SET upload="{0}" WHERE agent="{1}" AND custid="{2}"AND screenname="{3}" AND status="1"'.format(get.uploaded,get.agent,get.custid,get.screenname)

使用SQLite3的示例(使用?作为占位符 - 其他人使用%s:1或%(名称)s - 或上述任何/所有 - 但是在您的图书馆的文档中详细说明):

query = "update callerdetail set upload=? where agent=? and custid=? and screename=? and status=?"

然后,当执行查询时,您提供要作为单独参数替换的值:

cursor.execute(query, (get.uploaded, get.agent, get.custid, get.screenname))

如果你真的想要,你可以有一个便利功能,并将其减少到:

from operator import attrgetter
get_fields = attrgetter('uploaded', 'agent', 'custid', 'screenname')
cursor.execute(query, get_fields(get))