2014-10-21 119 views
2

我想用我的python程序查詢MySQL表。但是,我想要查詢的表格是其名稱作爲變量(參數)傳入的表格。Python動態表名稱的MySQL參數查詢

我想是這樣的:

readTable_query = """SELECT * FROM %s""" 
readTable_cursor.execute(readTable_query, (table_name)) 

這樣做的問題是動態生成的SQL查詢中引號把表名,即而不是產生像「SELECT * FROM產品」的查詢,它生成一個查詢,如「SELECT * FROM'products'」。這導致我的程序失敗並拋出錯誤。有沒有解決方法?

我知道我可以連接查詢,但這會導致SQL注入的安全風險。參考

全碼:

import MySQLdb 

table_name = 'products' 

db_connection = MySQLdb.connect(host,user,passwd,db) 
readTable_cursor = db_connection.cursor() 
readTable_query = """SELECT * FROM %s""" 
readTable_cursor.execute(readTable_query, (table_name)) 
+0

更多的代碼,請 – user1767754 2014-10-21 23:08:24

+1

一般情況下,SQL參數通常不允許參數表(本以爲是允許通過用戶輸入_at all_指定表是非常危險的,驗證用戶輸入只是錯誤的安全性)。特別是,Python的SQL參數化由DB-API 2規範定義,該規範不允許使用表名。更特別的是,MySQLdb的確允許它,但它沒有記錄,不應該依賴。正確的答案通常是建立一個前端視圖,讓您選擇一個列值爲後端的表格,然後參數化_that_。 – abarnert 2014-10-21 23:35:25

回答

3

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html,有效的表名由以下字符。 [0-9A-ZA-Z_ $]所以,它不應該是很難寫自己的驗證:

import re 
table_name_validator = re.compile(r'^[0-9a-zA-Z_\$]+$') 
if not table_name_validator.match(table_name): 
    raise ValueError('Hey! No SQL injecting allowed!')