2017-01-05 108 views
1

我有我的Python代碼,我想用於REST API服務器的問題。蟒蛇cursor.execute返回空

目前的問題是,我的數據庫查詢返回null,當我知道這個值是有

的特定路徑代碼:

@app.route('/data/active_predicted/<int:ticketId>', methods=['GET']) 
def search_db_tickId_act(ticketId): 
    cursor = db.cursor() 
    db_query = cursor.execute("select * from active_predicted where ticketId=" + str(ticketId)) 
    json_output = json.dumps(dict(cursor.fetchall())) 
    cursor.close() 
    if not cursor.fetchall(): 
     return "Nothing found \n SQL Query: " + "select * from active_predicted where ticketId=" + str(ticketId) 
    else: 
     return str(cursor.fetchall()) 

當我訪問這個網址我得到的返回以下:

未找到SQL查詢:SELECT * FROM active_predicted其中ticketId = 1324

當我插上這個SQL查詢時I g等我想要的結果,1行與2列,但它似乎程序無法找到行?

+0

我猜你消耗在該行'json_output = json.dumps(字典(cursor.fetchall()))'所有的結果,但我不是Python DB專家。我也建議你可能不希望使用字符串操作來構造查詢(DB接口有自己更安全的方式來指定參數)。 – Blckknght

+0

首先,不要通過字符串連接構造查詢,你的程序很容易受到sql注入的影響。遊標也因某個原因而被命名 - 它通過結果集前進,因此您無法反覆調用'fetchall' - 第一個fetchall會提取所有結果。 – pvg

+0

@pvg謝謝你的提示,我習慣了java編程,所以我對函數不太確定。另外,感謝您關於SQL注入的提示。問題是,即使沒有底部的if else語句,返回的JSON對象中也沒有任何數據。 – Jimmy

回答

0

的問題:

  1. 作爲@pvg提到的,你需要查詢數據庫時逃避你的輸入值;
  2. 如果您想獲取類似字典的結果,請在初始化光標時通過dictionary=True;
  3. 在您的原始代碼中,您沒有返回變量json_output;
  4. 要僅提取一個結果,請使用fetchone代替fetchall;
  5. 在調用了cursor.close()之後,無論您之前是否抓取過,您都可以從該遊標中獲取任何內容;
  6. 使用try-finally來確保遊標始終關閉(最後)。

這裏的固定碼:

@app.route('/data/active_predicted/<int:ticketId>', methods=['GET']) 
def search_db_tickId_act(ticketId): 
    try: 
     cursor = db.cursor(dictionary=True) 
     db_query = cursor.execute("select * from active_predicted where ticketId=%s LIMIT 1", ticketId) 
     row = cursor.fetchone() 
     if row: 
      return json.dumps(row) 
     else: 
      return "Nothing found \n SQL Query: " + "select * from active_predicted where ticketId=" + str(ticketId) 
    finally: 
     cursor.close() 
+0

謝謝!這個解決方案適用於我。由於錯誤,我不得不改變一些值,但代碼大部分保持不變。你能告訴我什麼是不同於這個代碼和我的原始,以及爲什麼我的原始代碼不起作用?再次非常感謝你! – Jimmy

+0

@Jimmy:很高興你解決了這個問題。我將解釋添加到我的答案中。 –