注意:我发现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,它是一个包含撇号的文本blob(谁知道还有什么)我需要一种方法来在UPDATE之前转义特殊字符。我怀疑我只需要做这个大规模的例程,我必须专门拼出字符,因为我倾向于找到它们但是我想看看是否有其他人有这个问题。
我很欣赏正确方向的任何指示。
答案 0 :(得分:2)
使用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设置中转义值。