對於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)
總結:不要使用字符串插值(''%),包括在SQL查詢中值。改用SQL參數; 'pandas.io.sql'直接支持參數。 –