【问题标题】:python MySQLDb insert with prepared Statements [duplicate]带有准备好的语句的python MySQLDb插入[重复]
【发布时间】:2013-08-10 08:00:45
【问题描述】:

我有一个包含字段的表格

TABLE_PASTE(
      user_text longtext NOT NULL,
      number integer NOT NULL
 )

我正在尝试使用 MySQLDb 驱动程序从 python 在此表 TABLE_PASTE 中插入一行。

text="large_text"
value = 1
cursor.execute("Update TABLE_PASTE set user_text = ? where number = ?",(text,value))

遇到这个错误

query = query % db.literal(args)
TypeError: not all arguments converted during string formatting

【问题讨论】:

    标签: python mysql database mysql-python


    【解决方案1】:

    对于MySQLdb,您希望使用类似于 Python 2.x 中的字符串格式化的参数化(从技术上讲,python 中不存在准备好的语句)语句。

    cursor.execute("Update TABLE_PASTE set user_text = %s where number = %s",(text,value))
    

    请注意,即使您的 valueint,您仍然必须在查询中使用 %s 对其进行格式化。

    你可以在MySQLdbhere找到一个很好的教程。

    【讨论】:

    • 上例中如何避免sql注入?
    • 不起作用。对于变量 text='abc' 这是一个字符串 cursor.execute 附加额外的 ' 单引号,如 cursor.execute("insert into table %s values %s", ('schema_name', 'ttt')) 给出错误异常你有SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“source_schema_name”值“ttt”附近使用正确的语法
    【解决方案2】:

    只是你可以使用

    cursor.execute("Update TABLE_PASTE set user_text = {} where number = {}" .format(text,value))
    

    format 函数将相应地格式化您的输入,无论是 int 还是 string!

    【讨论】:

    • 你不应该这样做,因为它绕过了 SQL 转义。
    • 使用用户输入直接格式化数据库语句会导致 SQL 注入漏洞。此处使用参数化查询的另一个答案应导致正确引用以避免 SQL 注入。
    猜你喜欢
    • 2012-07-08
    • 2021-08-26
    • 2015-10-12
    • 2016-12-17
    • 2015-03-02
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多