2016-05-04 192 views
0

我知道這個主題的變體已經在其他地方討論過了,但其他線程都沒有幫助。用Python中的字符串中的單個反斜槓替換雙反斜線

我想交出一個字符串從Python到SQL。然而,可能會發生撇號(')出現在字符串中。我想用反斜槓來逃避它們。

sql = "update tf_data set authors=\'"+(', '.join(authors).replace("\'","\\\'"))+"\' where tf_data_id="+str(tf_data_id)+";" 

但是,這總是會給我的字符串\\'。因此,反斜槓本身被轉義並且sql語句不起作用。

有人可以幫我或給我一個替代方式,我這樣做嗎? 謝謝

+0

提供你想要的原始字符串被髮送到SQL –

+0

你用事先準備好的聲明認爲? – mba12

+1

你可以使用佔位符,根本不需要任何轉義。作爲一個獎勵,你不會打開自己的SQL注入,如果和當逃跑忽視的東西。 –

回答

6

只是不要。
也不要連接sql查詢,因爲這些很容易sql注入。

相反,使用參數化查詢:

sql = "update tf_data set authors=%(authors)s where tf_data_id=%(data_id)s" 
# or :authors and :data_id, I get confused with all those sql dialects out there 


authors = ', '.join(authors) 
data_id = str(tf_data_id) 

# db or whatever your db instance is called 
db.execute(sql, {'authors': authors, 'data_id': data_id}) 
+0

謝謝,這與我所需要的非常接近。我只收到以下錯誤消息:ValueError:不支持的格式字符';' (0x3b)在索引66 – MaxS

+0

@MaxS你錯誤輸入了字符串中的最後一個's'嗎?也可以完全刪除';',因爲它不是必需的。 – Duncan

+0

@MaxS是的,應該沒有';'到底。我會從我的答案中刪除它。 – DeepSpace

0

正如其他人所暗示的,如果您使用python包來執行您的SQL,請使用提供的帶參數佔位符(如果可用)的方法。

我的答案解決了上述轉義問題。 使用一個字符串文字前綴[R

print(r"""the\quick\fox\\\jumped\'""") 

輸出:

the\quick\fox\\\jumped\' 
+0

如果我打印我的字符串,它會給我我想要的東西。但是,我將它添加到另一個字符串並將其交給SQL。在這種情況下打印不起作用 – MaxS

+0

print r「」「\ quick \ fox \\\ jumped \'」「」+ r「」「\ addition \\\」「」「OUTPUTS:\ quick \ fox \\ \ jumped \'\ addition \\\「 –

+0

另外你從來沒有說過」把它交給sql「的部分是什麼。你使用的是一個mysql包嗎?直接在命令行上執行?您的確切輸入和預期輸出在您的問題中沒有明確說明,因此任何人都難以回答您的問題。 –

2

您使用雙引號字符串,但仍然逃脫內他們的單引號。這不是必需的,您只需要在替換操作中使用想要使用的反斜槓即可。

>>> my_string = "'Hello there,' I said." 
>>> print(my_string) 
'Hello there,' I said. 
>>> print(my_string.replace("'", "\\'")) 
\'Hello there,\' I said. 

請注意,我正在使用打印。如果您只是要求Python在替換操作後向您顯示其字符串的表示形式,則會看到雙反斜槓,因爲它們需要轉義。

>>> my_string.replace("'", "\\'") 
"\\'Hello there,\\' I said." 
+0

與打印的問題是,sql語句不會被打印,因此sql會看到雙反斜槓以及 – MaxS

+0

不,它不會。該字符串不包含兩個反斜槓。 ''\\''是一個只有一個反斜槓的字符串。 – Matthias

+0

你有沒有嘗試之前說什麼SQL將做什麼? :)(哦,Matthias更快) – Ilja

相關問題