2012-07-12 86 views
1

我遇到了錯誤「沒有數據 - 取出,選擇或處理零行」錯誤。Python/MySQL:沒有數據 - 獲取,選擇或處理零行

我已經縮短了我的問題,因爲下面的答案描述了問題以及可能的解決方案。

回溯是:

cursor.execute("select function_1() from dual") 

/django/lib/python2.6/django/db/backends/util.py in execute 
15.    return self.cursor.execute(sql, params) 

/django/lib/python2.6/django/db/backends/mysql/base.py in execute 
86. return self.cursor.execute(query, args) 

usr/local/lib/python2.6/site-packages/MySQLdb/cursors.py in execute 
176.  if not self._defer_warnings: self._warning_check() 

/usr/local/lib/python2.6/site-packages/MySQLdb/cursors.py in _warning_check 
92.     warn(w[-1], self.Warning, 3) 

回答

2

我花了很長的時間來處理這個問題:「沒有任何數據 - 零行獲取,選擇,或加工」。我意識到部分問題是不同版本的MySQL(或者Django和Python)會導致不同的行爲。我不認爲這是Python或Django特有的,但不知道。我不知道它是否與一些設置的變量有關,而不是不同版本中固有的東西。

兩組版本的有:

  • SET1:(MySQL的:5.5.19),(的Python:2.7.1),(Django的:1.3.0)
  • SET2:(MySQL的: 5.0.05),(Python的:2.6.8),(Django的:1.2.4)

我做什麼:

在Python(Django的通過):

cursor.execute("select function_1() from dual") 
cursor.fetchall() 

定義:

  • 假人查詢指的是保證返回的行數據庫的任何查詢,但沒有在代碼邏輯的任何目的。
  • continue_handler_1329 is:declare continue handler for 1329 begin end;

版本SET1

情況1A:Python會自動調用function_1其最後一查詢返回NULL。我們得到錯誤。

  • 通過在末尾包含虛擬查詢(或確保最後一個查詢不返回空)來修復。
  • 包含continue_handler_1329沒有效果,假設function_1沒有光標。見下文。

CASE 1b:Python調用function_1,它調用function2。沒有mysql遊標。如果函數2的LAST查詢返回空值:函數2仍然正確計算並返回適當的值給函數1。

  • 無需修復。
  • 包括continue_handler_1329(在任一函數中)都沒有效果(它仍然有效)。

CASE 1c:Python調用function_1,它打開一個可以調用function2的遊標(無論是在遊標循環中還是在遊標中選擇本身)。如果函數2的LAST查詢返回null:這很糟糕。光標立即關閉,function_1繼續,就像光標已經被評估過一樣。沒有警告。

  • 通過包括函數2的結束虛查詢(或確保其最後一個查詢沒有返回null)固定
  • 包括函數2 continue_handler_1329沒有任何效果。
  • 在function_1中包含continue_handler_1329會導致無限循環。當遊標耗盡行時,遊標不會在它自己的處理程序中結束,而是在新處理程序中結束,而不是設置Done = True。

結論進行版本SET1:

  • 一個虛擬的查詢再加上從Python的,以及對可能從遊標調用任何函數調用的函數。否則確保這些函數的最後一個查詢不會返回null。 continue_handler_1329不能解決問題,並會導致帶有遊標的函數出現問題(除非continue_handler_1329在自己的範圍內)。

版本SET2

殼2A:Python會自動調用function_1凡有任何查詢返回NULL。我們得到錯誤。

  • 沒有虛擬查詢可以解決這個問題。
  • 通過包含continue_handler_1329進行修正,假設function_1沒有任何光標(見下文)。或者確保沒有查詢返回null。

案例2b:Python調用function_1,它調用function2。沒有mysql遊標。如果function2s有ANY查詢返回null:我們得到錯誤。

  • 沒有虛擬查詢可以解決這個問題。
  • 通過在function2中包含continue_handler_1329(或確保沒有查詢返回null)進行修復。
  • 包括功能1 continue_handler_1329沒有影響,除非它有一個光標(見下文)

框架2C:Python會調用function_1,打開一個遊標,以創建函數2(或者是光標環或 內的呼叫在光標中選擇自己)。如果函數2有ANY查詢返回null:我們得到錯誤。

  • 沒有虛擬查詢可以解決這個問題。
  • 通過在function2中包含continue_handler_1329(或確保沒有查詢返回null)進行修復。
  • 在function_1中包含continue_handler_1329會導致無限循環。當遊標耗盡行時,遊標不會在它自己的處理程序中結束,而是在新處理程序中結束,而不是設置Done = True。

結論爲SET2

  • 版本添加continue_handler_1329到可能有一個查詢返回null,與功能的異常使用遊標的任何功能。這些應該不包含任何返回null的查詢,但聲明的遊標本身除外。但是帶有遊標的函數可能包含一個帶有空返回查詢和continue_handler_1329的獨立開始結束範圍。

總之它在兩個工作:

  • 添加continue_handler_1329可能含有查詢返回NULL和一個虛擬查詢添加到從Python中調用的函數,以及所有功能到可以從光標調用的任何函數。帶有遊標的函數可能不包含continue_handler_1329,也不會返回null,除非它們位於單獨的開始結束範圍內。 (遊標查詢本身可能返回null,這將由遊標的繼續處理程序處理。)。