通常我使用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'对象没有'已上传'属性
请帮我查询我的查询有什么问题?
答案 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))