2012-03-01 48 views
8

我想遍歷表中的所有行命名吞吐量,但對於特定的DeviceName(我已經存儲在數據['DeviceName']]我已經試過以下,但它不工作:pyodbc - 如何使用參數執行一個選擇語句使用變量

for row in cursor.execute("select * from Throughput where DeviceName=%s"), %(data['DeviceName']): 

編輯:也嘗試過這一點,但它不工作:

for row in cursor.execute("select * from Throughput where(DeviceName), values(?)", (data['DeviceName'])): 

EDIT2:我的最終工作代碼片段:

query = "select * from Throughput where DeviceName = '%s'" % data['Device Name'] 
     try: 
      for row in cursor.execute(query): 
+0

「不工作」怎麼樣?你收到什麼錯誤或意外的行爲? – Andy 2012-03-01 15:17:49

回答

-11

不知道列設備名稱,什麼數據庫服務器的類型,我想引用正被用來限制設備名稱

"select * from Throughput where DeviceName='%s'" % data['DeviceName'] 

,並看看會發生什麼的字符串。

+0

謝謝。這就是訣竅! – Parth 2012-03-01 15:45:20

+6

如果data ['DeviceName']'是以任何方式(直接或間接)由用戶提供的,那麼您只是打開自己的SQL注入攻擊。或者devicename使用引號,這只是打破。 *並且*效率低下,因爲驅動程序無法爲SQL語句重新使用準備好的查詢計劃。 – 2015-01-10 13:41:20

33

你也能parameterize聲明:

... 
cursor.execute("select * from Throughput where DeviceName = ?", data['DeviceName']) 
... 

這出於以下原因一個更好的方法:

  • 針對SQL注入防護(你應該總是驗證用戶輸入無論參數還是使用動態SQL)
  • 由於參數分別傳遞到數據庫,您不必擔心使用單引號轉義where子句值
  • SQL準備一次查詢的後續執行使用事先準備好的聲明,而不是重新編譯
+0

當這樣做時,有沒有什麼辦法可以打印出整個查詢,因爲我有日期/時間轉換錯誤,但我不知道在哪裏,但是,當我打印出查詢字符串時,它會顯示問號而不是應該取代這些問號的實際值。如果你可以看看我的問題http://stackoverflow.com/questions/37861319/pyodbc-cursor-execute-wont-insert-parameters-into-sql-string?noredirect=1#comment63185389_37861319我真的很感激它。 – 2016-06-16 16:53:48

+0

@ M.Barbieri,在MySQL中啓用日誌記錄以查看實際執行的語句。 – DrDamnit 2017-06-19 19:15:29

相關問題