2012-05-16 63 views
0

我正在尋找一個很好的「pythonic」和「SQL-Injection-free」解決方案,用於解決MySQL中保留字的問題。用Python轉義MySQL保留字dbapi

我有以下代碼:

alter_sql = 'ALTER TABLE %s ADD COLUMN %s TEXT'  
cursor.execute(alter_sql, sql_params) 

當列名是一樣的東西「指數」,「詮釋」,「限制」,會出現問題....

在MySQL外殼中,我可以這樣做:

ALTER TABLE test ADD COLUMN test.limit; 

ALTER TABLE test ADD COLUMN `limit`; 

但不是

ALTER TABLE test ADD COLUMN 'test.limit'; 

我該如何用Python和MySQLdb實現?

回答

2

也許這將工作:

alter_sql = 'ALTER TABLE `%s` ADD COLUMN `%s` TEXT' 

UPDATE:這似乎沒有工作,因爲綁定參數這樣會增加單引號,因爲MySQLdb的假設這是一個字符串文字。

或者,您可以在列名之前追加表名?

table_name = MySQLdb.escape_string(table_name) 
escaped_column_name = MySQLdb.escape_string(column_name) 
column_name = '`%s`.`%s`' % (table_name, escaped_column_name) 

alter_sql = 'ALTER TABLE %s ADD COLUMN %s TEXT' % (table_name, column_name) 

這樣,您必須手動轉義它們,以避免綁定它們並在其周圍添加單引號。

+0

您正在使用的查詢的工作方式如何?它會輸出如下內容:'ALTER TABLE'mytable'ADD COLUMN ...'這不起作用... – jadkik94

+0

生成的SQL將是''ALTER TABLE''test''ADD COLUMN''limit''TEXT''這是無效的。 – kijasek

+0

您的原始查詢。它沒有輸出類似於我在評論中提到的內容嗎?我試過了,它不起作用:「檢查語法......」錯誤 – jadkik94

0

here

可以發出通過用%s佔位符標記和相應的值綁定到他們相同的語句:

cursor.execute("""UPDATE animal SET name = %s 
        WHERE name = %s 
       """, ("snake", "turtle")) 
print "Number of rows updated: %d" % cursor.rowcount 

注意以下幾點:在先的形式執行()調用:

  • 對於要插入的每個值,%s佔位符標記應該出現一次nto語句字符串。
  • 不應在%s標記周圍放置引號; MySQLdb根據需要爲您提供報價。
  • 在execute()的語句字符串參數之後,按照它們應該出現在字符串中的順序提供一個包含要綁定到佔位符的值的元組。如果你只有一個值x,則將它指定爲(x,)來表示單元素元組。
  • 將Python無值綁定到佔位符以將SQL NULL值插入到語句中。

因此,基於這一點,你應該只是前處理你的論點,看看他們在保留關鍵字的列表,如果是這樣,可以在前面的表名的列名,如。

RESERVED_KEYWORDS = ['LIMIT', 'INT', 'INDEX'] 
table_name = 'TESTING' 
column_name = 'LIMIT' 
if column_name in RESERVED_KEYWORDS: 
    column_name = '%s.%s' % (table_name, column_name) 
sql_params = [table_name, column_name] 
alter_sql = 'ALTER TABLE %s ADD COLUMN %s TEXT'  
cursor.execute(alter_sql, sql_params) 
+0

我試過了,但MySQLdb創建了以下SQL:ALTER TABLE測試ADD COLUMN'test.limit';由於test.limit周圍的引用,這是無效的。 – kijasek

+0

如果你100%確定你的輸入已經過清理,你可以執行'sql_query = alter_sql%sql_params; cursor.execute(sql_query)'首先插入SQL語句和參數,然後執行它。不完全是最好的方法,但應該工作。 –

+0

確實如此。不幸的是我不能相信輸入。 – kijasek