我似乎在理解如何将变量从python传递到mySQL db时遇到了问题。 例如,我有这段代码:
cursor.execute("UPDATE table SET %s = %s + 1 WHERE name = %s", (variable1,variable2,judge))
我试图在数据库中增加某个值,然后即时获取 和mySQL语法中的错误。 但不知何故,在我的代码的另一部分我基本上做同样的事情,它的工作原理,例如,这工作正常:
cursor.execute("SELECT row FROM Table WHERE name IN (%s)", (name))
不知怎的,我觉得我应该将参数传递给mySQL代码片段的方式有些不一致。
关于在这种情况下我应该做些什么的一般建议?
答案 0 :(得分:0)
在第二个参数中传递给cursor.execute
的值必须是字段值。不能是字段或表格本身的名称。
cursor.execute("UPDATE table SET %s = %s + 1 WHERE name = %s", (variable1,variable2,judge))
失败,因为variable1
(可能variable2
)是字段(列)名称。
cursor.execute("SELECT row FROM Table WHERE name IN (%s)", (name,))
成功,因为name
是一个值。
注意我在name
之后添加了一个逗号,因为第二个参数必须是序列。
字段和表名必须是SQL字符串的一部分 本身。因此,要修复第一个语句,请使用字符串格式 插入字段名称:
cursor.execute("UPDATE table SET {} = {} + 1 WHERE name = %s".format(variable1, variable2), (judge,))
请注意,使用字符串格式化会使代码容易受到SQL的攻击
如果variable1
或variable2
是用户提供的,则进行注入。在这种情况下,您需要提供有效字段名称的白名单,并且只允许用户从该列表中选择值。