2010-08-23 46 views
5

這是我的查詢。Python/MySQL組合的最佳轉義字符策略是什麼?

cursor2.execute("update myTable set `"+ str(row[1]) +"` = \"'" + str(row[3]) +"'\" where ID = '"+str(row[0])+"'") 

行值有雙引號「some value」時失敗。我如何逃避所有特殊字符?

+2

爲Python + MySQL的最好的逃生策略準備查詢。 – zneak 2010-08-23 16:42:19

+0

請您詳細說明一下嗎?謝謝! – ThinkCode 2010-08-23 16:42:56

+0

@zneak:準備1k行的擴展插入。 – Mchl 2010-08-23 16:46:16

回答

13

下面是一個例子:

import MySQLdb 
column = str(MySQLdb.escape_string(row[1])) 
query = "update myTable set %(column)s = %%s where ID = %%s" % dict(column = column) 
cursor2.execute(query, [row[3], row[0]]) 

更新

這裏是一個簡短的評論:

column = str(MySQLdb.escape_string(row[1])) 

總是一個好主意,以逃避任何進入查詢。在這種情況下,我們正在動態地添加一個列名,因此在查詢執行之前它必須被轉義。

query = "update myTable set %(column)s = %%s where ID = %%s" % dict(column = column) 

我在這裏形成查詢。我試圖實現兩件事情:(1)使用上一行(2)中聲明的column變量填充的列名形成查詢,添加將在查詢執行期間由實際參數填充的佔位符。

片段dict(column = column)實際上是創建字典{'column': column}的另一種方式。這可以使用dict構造函數。我不想 只填寫其他地方的持有人,所以我使用兩個百分號(%%)逃脫他們。

cursor2.execute(query, [row[3], row[0]]) 

最後執行查詢。如果您在執行前打印查詢,您將看到字符串update myTable set column_name = %s where ID = %s

+0

你能解釋一下你的方法嗎?它工作出色!我不明白字典(列=列)部分.. – ThinkCode 2010-08-23 17:33:09

+0

已更新的回答。往上看。 – 2010-08-23 17:45:48

+1

列轉義在這裏是錯誤的,列是標識符並且需要''字符並加倍''如果裏面有一些(在列名中),而不是引號轉義。 – regilero 2013-12-10 11:08:16

7

對於值,您應該使用準備好的查詢來嵌入它們。對於排,我不太確定...這取決於你的設置。您可能想要接受ASCII值32以上的任何字符,但不包括未轉義的反引號。不過,不要認爲這有一個特定的功能。

cursor2.execute("UPDATE myTable SET `" + str(row[1]) + "` = ? WHERE ID = ?", (row[3], row[1])) 

準備好的查詢有問號裏應該有變量,你在列表中通過或元組爲第二個參數指定什麼他們應該被取代。司機將負責保證值的安全。儘管如此,你只能在需要價值的地方放置訊問標記;所以你不能使用它們作爲列名。

7

你應該學會使用查詢參數:

colname = str(row[1]).replace("`", "\\`") 
sql = "update myTable set `%s` = :col1 WHERE ID = :id" % (colname) 
cursor2.execute(sql, {"col1":str(row[3]), "id":str(row[0])}) 
+0

_mysql_exceptions.ProgrammingError:(1064,「你的SQL語法有錯誤;請查看與你的MySQL服務器版本相對應的手冊,以找到在第一行使用':col1 WHERE ID =:id'附近的正確語法」)任何指針?謝謝.. – ThinkCode 2010-08-23 17:21:47

+0

也許這些命名參數僅適用於Oracle。嘗試使用'?'位置參數來代替@zneak的答案。 – 2010-08-23 18:17:32

2

當你使用Oracle MySql connector你能逃脫在後續的方式特殊字符:

import mysql.connector 
from mysql.connector import conversion 

query = "SELECT id, code, name, description FROM data WHERE code='{:s}'" 

escaped_text = conversion.MySQLConverter().escape(unescaped_text) 

cursor.execute(query.format(escaped_text)) 
+0

這看起來不像預期的那樣工作:'conversion.MySQLConverter()。escape('blah; truncate other;')'=>''blah;截斷其他;''。 – b4hand 2015-09-21 20:30:39

相關問題