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]应该转换为 int,因为它将是一个 int(作为字符串输入)。

所以,如果我只放%s'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是整数。解决方案是什么?

4

1 回答 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]))
于 2012-05-15T04:25:56.840 回答