2012-11-30 114 views
4

我正在使用cx_Oracle訪問我們的數據庫。我希望用戶能夠輸入站ID,例如:cx_Oracle中的用戶輸入變量?

的stationID =(無論用戶在提示輸入)

cursor.execute('''select cruise, station, stratum 
      from union_fscs_svsta 
      where station=stationID 
      order by cruise''') 

因爲該語句必須是一個字符串,我該怎麼辦合併一個用戶定義的變量?

+0

你在問怎麼安全地做,或者怎麼做? (永遠不要相信用戶輸入... SQL注入等) –

+0

這是真的,重新輸入...有沒有一種安全(更安全)的方式來做到這一點? –

回答

8

如何做到這一點:

id = raw_input("Enter the Station ID") 
query = "select foo from bar where station={station_id}" 
cursor.execute(query.format(station_id=id)) 

如果有人進入一個惡意的SQL字符串,它會被執行。

不是使用python格式化字符串,而是讓數據庫後端爲您處理它。您的具體做法取決於您使用的數據庫。我認爲(?)這對於Oracle來說是正確的,但我無法測試它。某些數據庫使用不同的字符(例如,在SQLite的情況下,?而不是%s)。

id = raw_input("Enter the Station ID") 
query = "select foo from bar where station=%s" 
cursor.execute(query, [id]) 

編輯:顯然,cx_Oracle默認爲 「名爲」 paramstyle(您可以在看看cx_Oracle.paramstyle檢查這一點。)。在這種情況下,你可以這樣做:

query = "select foo from bar where station=:station_id" 
cursor.execute(query, station_id=id) 
+4

這對我不起作用 - 我必須將參數作爲字典提交 - cursor.execute(query,{'station_id':id})。否則,現貨,謝謝! – scubbo

+3

您可以使用位置參數作爲「:0」,「:1」等與cx_Oracle。 – Beli

+0

可以舉一個例子@Beli select * from:0.:1如果0是schemaname而1是tablename – user2601010