【问题标题】:Problems with execute parameters type in MySQLdbMySQLdb中执行参数类型的问题
【发布时间】:2012-05-15 04:14:44
【问题描述】:
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 是一个整数。 有什么办法解决这个问题?

【问题讨论】:

    标签: python string execute mysql-python


    【解决方案1】:

    我发现了几个问题。
    可能还有更多。

    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]))
    

    【讨论】:

    • 感谢 bernie,替换字符串然后使用执行就可以了。我知道sql注入,这部分软件的使用保留给管理员!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-06-08
    • 1970-01-01
    • 2018-02-10
    • 2011-10-29
    • 2017-07-27
    • 2015-09-02
    相关资源
    最近更新 更多