使用 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 设置中的值。
注意: 我发现 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 设置中的值。