2013-04-08 50 views
0

我有使用字典來存儲狀態,按鍵的數量和價值不固定的,比如如何使用準備語句「從xxx選擇其中xxx」使用python

dict = {} 
dict['v1'] = 'abc' 
dict['v2'] = 123 
... 
dict['vn'] = xxx 

我的SQL格式是

SELECT * FROM表名,其中V1 = 'ABC' 和v2 = 123 ... VN = XXX

我試圖打開這樣的SQL第一:

SQL = 「從表名,其中V1 =%s和V2 =%s和選擇* ... VN =%s」 時

下面的格式可避免SQL注入的問題是,我不知道數值的數量,如何編寫這個準備好的陳述。提前致謝。

cursor.execute(SQL,字典[V1],字典[V2],...,字典[V])

回答

0

下面應該工作:

sql = 'select * from tablename where ' + ' and '.join(k + ' = %s' for k in data) 
cursor.execute(sql, tuple(data.values())) 

確保你不進行任何修改的字典創建sql字符串和執行該語句之間,因爲如果你做的排序可以改變。

請注意,我將您的字典重命名爲data,因此它不會使用dict作爲變量名稱,因爲它會掩蓋內置類型。我不完全確定是否需要轉換到元組。

+0

它工作,THX,:) – alexqinbj 2013-04-09 01:37:47

+0

提防data.values()排序 - 它可能看起來分類,但沒有保證 – petr 2013-04-09 13:53:28

0

我會使用類似以下內容paramerise執行功能:

def print_test(sql, param1, param2, param3, param4, param5): 
    # just output some of the parameters.. 
    print param2, param3 

print_test("whatever", *(i for i in range(5))) 

上面是一個簡單的例子來說明在print_test函數中發生了什麼。我假設你想要進行某種排序,因此OrderedDict將非常適合你。然後,您可以簡單地導出值並且順序將保持一致。將它們作爲元組轉換,執行函數將展開它所需的內容。

1

或許矯枉過正,但你可以使用優秀的SqlAlchemy庫:

from sqlalchemy.sql import select 
from sqlalchemy import create_engine, MetaData, Table 
engine = create_engine('mysql://your_connection_string') 
meta = MetaData() 
table = Table('table_name', meta, autoload=True, autoload_with=engine) 
s = select([table]) 
for key, val in dict.items(): 
    s = s.where(getattr(table.c, key)==val) 
for row in conn.execute(s): 
    print row 

如果你打算在你的Python做了很多的SQL這可能是值得的。

http://docs.sqlalchemy.org/en/latest/core/tutorial.html

相關問題