2012-12-18 70 views
2

Possible Duplicate:
Python challenging string encoding從Python列表的SQL查詢

我試圖把行情列表到SQL查詢中刪除括號。我是Python的新手。

CUS被設置爲[ 'X', 'Y',......, '一']列表

test = psql.frame_query(
    "select * from dataBase where cus IN (%r)", con = db) % cus 

我嘗試這樣做,它失敗了。

我的下一個嘗試是試圖取下支架,然後粘貼在列表中如何刪除括號,使我得到:

cus2 = 'x', 'y', ..., 'a' 

我要做的事情:

str = "select * from dataBase where cus IN (%r)" % cus2 
test2 = psql.frame_query(str, con = db) 

或者還有另外一種方法我應該試試這個?

謝謝。

+0

總結:不要使用字符串插值(''%),包括在SQL查詢中值。改用SQL參數; 'pandas.io.sql'直接支持參數。 –

回答

3

對於SQL,您確實想避免將您的值插入到查詢中。您通常會將其留給數據庫適配器,該適配器具有關於如何避免從值中創建危險SQL(SQL引用轉義,又名SQL注入攻擊)的專業知識。

不幸的是,pandas.io.sql module只有半心半意的參數支持。

而不是使用frame_query,直接使用DataFrame.from_records()

首先,用參數生成SQL查詢。 SQL參數的格式不同於數據庫適配器和數據庫適配器,因爲Python DB API standard允許有幾個變體。我假設你正在使用MySQL在這裏,它使用%s的位置參數,呼應Python的語法:

sql = "select * from dataBase where cus IN ({0})".format(', '.join(['%s'] * len(cus2))) 

創建用於cus2每個值足夠的參數。然後查詢數據庫:

cur = psql.execute(sql, con, params=cus2) 
rows = cur.fetchall() 
columns = [col_desc[0] for col_desc in cur.description] 
cur.close() 

result = DataFrame.from_records(rows, columns=columns, coerce_float=True) 

既然你似乎是使用Sybase module模塊的連接,你必須調整本作的(有點非標)的SQL參數的語法,庫使用。它只有接受命名的參數,它使用的形式@name

params = dict(('@param{0}'.format(i), v) for i, v in enumerate(cus2)) 
sql = "select * from dataBase where cus IN ({0})".format(
    ', '.join(sorted(params.keys()))) 

cur = psql.execute(sql, con, params=params) 
rows = cur.fetchall() 
columns = [col_desc[0] for col_desc in cur.description] 
cur.close() 

result = DataFrame.from_records(rows, columns=columns, coerce_float=True) 
+0

非常感謝您的幫助。 – user1911092

+0

一個後續行爲:對於cur = psql.execute(sql,con,params = cus2)行,我收到一個錯誤消息: AttributeError:'list'object has no attribute'items' 當前列表設置['x','y',...] – user1911092

+0

@ user1911092:你連接了哪個數據庫? –