python - MySQLdb 中执行参数类型的问题

标签 python string execute mysql-python

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,当然会出现这个错误:

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. 您不能参数化表名和列名。 但是,您可以执行字符串替换,然后调用 .execute()
    如果您的程序需要用户输入,您需要警惕 SQL-injection 的可能性攻击。

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

例子:

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

关于python - MySQLdb 中执行参数类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10594063/

相关文章:

python - 一个应用程序中的 discord bot 和 websocket 服务器

python - 使用 pip 安装一个包的多个版本

C:将字符串的单独字母打印到屏幕上

java - 执行外部.class 文件?

function - 如何在 EXECUTE 格式语句中使用时间戳变量

php - 从 php 在计算机上运行脚本

python - 在Python中快速对二维数组进行装箱的方法

python - Tkinter打开文件窗口,文件扩展名区分大小写

python - 如何从列表中的多个字符串中打印出 1 个字符串

java - 在java中将 int 1 转换为字符串 'one' 、 2 转换为 'two' 等时出现问题