0

通常我使用 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”对象没有“已上传”属性

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

4

2 回答 2

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 的示例(?用作占位符 - 其他人使用%sor:1或 %(name)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))
于 2012-09-29T09:28:45.023 回答
0

Get 可能正在映射到 ac 对象。尝试将您的“get”对象重命名为其他对象。

这是保留字列表。我看不到那里,但听起来它可能是被包含的 ac 库的一部分。如果您使用from x import *包含某些内容,您可能会在不知道的情况下导入它。

于 2012-09-29T08:35:25.760 回答