2015-09-07 114 views
0

Python API將作爲特定產品屬性的值返回u"'HOPPE'S No. 9'"。然後我期待將其插入到數據庫,還使用Python(蟒蛇-MySQLdb的),用下面的查詢:如何處理MySQL-Python中的撇號?

INSERT INTO mytable (rating, Name) VALUES('5.0 (7)', 'HOPPE'S No. 9'; 

MySQL的拒絕這一點,建議的方式在MySQL處理單引號是escape it first。我需要在Python中完成,所以我嘗試:

In [5]: u"'HOPPE'S No. 9'".replace("'", "\'") 
Out[5]: u"'HOPPE'S No. 9'" 

當我將它加入到我的程序中時,MySQL仍然拒絕它。所以我 - 逃生撇號,然後插入成功發生。事情是,它包含轉義字符(所以寫的是'HOPPE'S第9')。

如果我需要第二個轉義字符,但是當我將它添加進去時,那麼如何處理轉義而不在轉義字符中包含插入的字符串呢?

編輯:基於theBjorn的建議,嘗試:

actualSQL = "INSERT INTO %s (%s) VALUES(%s);" 

#cur.execute(queryString) 
cur.execute(actualSQL, 
      (configData["table"], sqlFieldMappingString, sqlFieldValuesString)) 

但它看起來像我回到我在那裏當我試圖用單一的逃生與.replace()逃脫:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''mytable' ('rating, Name, Image, mfg, price, URL') VALUES('\'5.0 (3)\', \'AR-1' at line 1 
+2

在SQL中,您通過加倍引用單引號,但爲什麼不使用參數? – thebjorn

+1

參數化僅用於值子句。注意我每個值都有一個'%s',並且在sql和值元組之間有一個逗號(這不是字符串插值!) – thebjorn

+0

@thebjorn好所以現在的問題是我是字符串格式的configData [「表「]和sqlFieldMappingString,當我不應該。問題是:我無法像下面那樣對列名進行硬編碼,因爲它們將分別來自變量* configData [「table」] *和* sqlFieldMappingString *。 – Pyderman

回答

2

你不應該這樣構造sql。改用參數代碼:

cursor.execute(
    "insert into mytable (rating, name) values (%s, %s);", 
    ("5.0 (7)", "HOPPE'S No. 9") 
) 

您的最新問題是由於誤以爲這是字符串插值,它不是(使用%s是混亂的),這樣的:

actualSQL = "INSERT INTO %s (%s) VALUES(%s);" 

會是錯的。有可能構建你的sql字符串,但可能更容易在兩個步驟中這樣做,所以我們不會通過看起來像字符串插值標記的sql參數標記。假設你已經在一個名爲field_values元組的值:

params = ["%s"] * len(field_values)   # create a list with the correct number of parameter markers 
sql = "insert into %s (%s) values (%s)" % (# here we're using string interpolation, but not with the values 
    configData["table"], 
    sqlFieldMappingString, 
    ', '.join(params) 
) 

如果你print sql它應該像我上面的例子。現在您可以執行它:

cursor.execute(sql, field_values) 
+0

謝謝,看看我上面的編輯,我嘗試了一個你的建議的變種 - 仍然沒有運氣。我究竟做錯了什麼? – Pyderman

+0

是的字符串格式化運算符和參數化的組合讓我難住。再次感謝。 – Pyderman