使用Python / MySQLdb

时间:2017-05-22 14:49:38

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

注意:我发现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之前转义特殊字符。我怀疑我只需要做这个大规模的例程,我必须专门拼出字符,因为我倾向于找到它们但是我想看看是否有其他人有这个问题。

我很欣赏正确方向的任何指示。

1 个答案:

答案 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设置中转义值。