【问题标题】:Escaping characters for MySQL for UPDATE operation using Python/MySQLdb使用 Python/MySQLdb 为 MySQL 转义字符以进行 UPDATE 操作
【发布时间】:2017-10-22 07:05:57
【问题描述】:

注意:我发现 re.escape(string) 会转义,但是人,它会转义很多吗?如果必须,我可以使用它,但我将问题留给任何其他想法,以防将来偶然发现。

我找到了一个很棒的 S.O.在这里回答关于使用 Python 将数据插入 MySQL(我使用的是 2.7),其中数据包含撇号:Python mySQL - escaping quotes

简而言之,S.O.答案是这样做.....

sql = "INSERT INTO TABLE_A(COL_A,COL_B) VALUES(%s, %s)"
a_cursor.execute(sql, (val1, val2))

不过,我需要为 UPDATE 执行此操作。我目前的方法是......

sql = "UPDATE table SET COL_A='R', COL_B='%s', COL_C='%s', COL_D='%s', COL_E='%s',COL_F='%s' WHERE COL_G='%s'" % (val1, val2, val3, val4, val5, val6)
cur.execute(sql)

我得到的错误是:1064 语法错误。

问题是 val5,它是一个包含撇号的文本块(谁知道还有什么),我需要一种在 UPDATE 之前转义特殊字符的方法。我偷偷地怀疑我只需要做这个庞大的例程,我必须专门拼出我倾向于找到的字符,但我想看看是否有其他人遇到过这个问题。

感谢任何指向正确方向的建议。

【问题讨论】:

  • 我最终使用了一个函数来转义单个撇号。不过,我不会选择我自己的答案。
  • 您的实际代码中是否所有这些花哨的引号,或者您是否在某处使用了插入它们的编辑器?由于这些引号,‘R’ 无效,请使用 'R'..
  • 不确定,但我只使用常规单引号。

标签: python sql python-2.7 escaping mysql-python


【解决方案1】:

使用SQL参数;这些被转义和引用为你;请注意,您找到的 INSERT 查询使用了这种技术。 SQL 参数转义可以正确处理撇号,并确保您不会成为 SQL 注入攻击的受害者,以及其他优点。

从您的 sql 值中,删除参数周围的引号,并将值作为参数传递,使用插值:

sql = "UPDATE table SET COL_A='R', COL_B=%s, COL_C=%s, COL_D=%s, COL_E=%s, COL_F=%s WHERE COL_G=%s"
cur.execute(sql, (val1, val2, val3, val4, val5, val6))

或使用多行字符串以获得更好的可读性:

sql = """
    UPDATE table
    SET
        COL_A='R',
        COL_B=%s,
        COL_C=%s,
        COL_D=%s,
        COL_E=%s,
        COL_F=%s
    WHERE COL_G=%s"
cur.execute(sql, (val1, val2, val3, val4, val5, val6))

顺便说一句,re.escape() 是一个处理转义字符串的函数,您希望将其视为正则表达式中的文字值。该函数完全不适合在 SQL 设置中转义值。

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2012-03-11
    • 2011-01-11
    • 2015-05-31
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多