使用MySQLdb时遇到的执行参数类型问题

3
c.execute("UPDATE Players SET %s = %d WHERE nick=%s",
          (parts[1], int(parts[2]), parts[0]))

显示了错误信息

TypeError: %d format: a number is required, not str

我知道execute只应该接受%s,但parts[2]应该被转换为整数,因为它将作为字符串输入。

因此,如果我仅使用%s,那么肯定会出现以下错误:

mysql_exceptions.ProgrammingError: (1064,
"You have an error in your SQL syntax; "
"check the manual that corresponds to your MySQL server version "
"for the right syntax to use near "
"''wins' = '450' WHERE nick='xan'' at line 1")

因为wins是一个整数。 这个问题的解决方法是什么?

1个回答

10

我看到了几个问题。
可能还有其他的问题。

  1. 您无法将表和列名作为参数化。 不过,您可以进行字符串替换,然后调用.execute()方法。
    如果程序接收用户输入,则需要注意潜在的SQL注入攻击。

  2. 无论参数类型如何,始终使用%s
    MySQLdb会处理任何需要执行的引号。

例如:

sql_stmt = "UPDATE Players SET {} = %s WHERE nick=%s;".format(parts[1])
c.execute(sql_stmt, (int(parts[2]), parts[0]))

谢谢Bernie,替换字符串然后使用execute就解决了问题。 我知道SQL注入,这部分软件的使用是保留给管理员的! - nitrnitr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接