使用 Python/MySQLdb 为更新操作转义 MySQL 的字符

Escaping characters for MySQL for UPDATE operation using Python/MySQLdb

注意: 我发现 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))

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

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 之前转义特殊字符的方法。我暗暗怀疑我只需要做这个大量的例程,我必须特别拼出字符,因为我倾向于找到它们,但我想看看是否有其他人遇到过这个问题。

我很感激任何正确方向的指示。

使用SQL参数;这些被转义并引用 for you;请注意,您找到的 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 设置中的值。