2017-05-22 68 views
1

注意:我發現re.escape(string)會轉義,但是man轉義很多。如果必須的話,我可以使用它,但是我會留下任何其他想法的問題,以防萬一未來發生這種情況。使用Python/MySQLdb進行UPDATE操作的MySQL的轉義字符

我發現了一個很棒的S.O.在這裏回答關於INSERT數據到Python與Python(我使用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

我結束了使用函數,而不是逃避單撇號。雖然我不會選擇我自己的答案。 –

+0

在你的實際代碼中是否使用了所有這些花哨的引號,或者你是否在某處插入了編輯器? ''R''因爲這些引號無效,所以使用''R'.. –

+0

不確定,但我只使用普通單引號。 –

回答

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設置中轉義值。