「データがありません - フェッチ、選択、または処理された行がありません」という問題に長い間対処してきました。問題の一部は、MySQL (またはおそらく Django と Python) の異なるバージョンが異なる動作を引き起こすことにあることに気付きました。これは Python や Django に固有のものではないと思いますが、わかりません。さまざまなバージョンに固有のものではなく、設定されているいくつかの変数と関係があるかどうかはわかりません。
2 セットのバージョンは次のとおりです。
- 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 は: 1329 begin end の継続ハンドラーを宣言します。
バージョンセット1で
ケース 1a: Python は、LAST クエリが NULL を返す function_1 を呼び出します。エラーが発生します。
- 最後にダミー クエリを含めることで修正しました (または、最後のクエリが null を返さないようにします)。
- function_1 にカーソルがないと仮定すると、continue_handler_1329 を含めても効果はありません。下記参照。
ケース 1b: Python は function2 を呼び出す function_1 を呼び出します。mysql カーソルはありません。function2 の LAST クエリが null を返す場合: Function2 は適切に評価され、function1 に適切な値を返します。
- 修正は必要ありません。
- continue_handler_1329 を (どちらの関数にも) 含めても効果はありません (それでも機能します)。
ケース 1c: Python は function_1 を呼び出します。これは、function2 を呼び出すカーソルを開きます (カーソル ループ内またはカーソル選択自体のいずれか)。function2 の LAST クエリが null を返す場合: これは悪いことです。カーソルはすぐに閉じられ、カーソルが評価されたかのように function_1 が続行されます。警告はありません。
- function2 の最後にダミー クエリを含めることで修正しました (または、最後のクエリが null を返さないようにします)。
- function2 に continue_handler_1329 を含めても効果はありません。
- function_1 に continue_handler_1329 を含めると、無限ループが発生します。行がなくなった場合、カーソルは独自のハンドラーではなく、新しいハンドラーで終了し、Done = True を設定しません。
VERSION SET1 の結論:
- Python から呼び出される関数と、カーソルから呼び出される可能性のあるすべての関数に、最後のダミー クエリを追加します。または、これらの関数の最後のクエリが null を返さないようにします。continue_handler_1329 は問題を解決せず、カーソルを使用する関数で問題を引き起こします (continue_handler_1329 が独自のスコープ内にない場合)。
バージョンセット2で
ケース 2a: Python が function_1 を呼び出し、ANY クエリが NULL を返す。エラーが発生します。
- これを修正できるダミー クエリはありません。
- function_1 にカーソルがないと仮定して、continue_handler_1329 を含めることで修正されました (以下を参照)。または、null を返すクエリがないことを確認します。
ケース 2b: Python は function2 を呼び出す function_1 を呼び出します。mysql カーソルはありません。function2s に null を返すクエリがある場合: エラーが発生します。
- これを修正できるダミー クエリはありません。
- function2 に continue_handler_1329 を含める (またはクエリが null を返さないようにする) ことで修正されました。
- function1 に continue_handler_1329 を含めても、カーソルがない限り効果はありません (以下を参照)。
ケース 2c: Python は function_1 を呼び出します。これは、function2 を呼び出すカーソルを開きます (カーソル ループ内またはカーソル選択自体で)。function2 に null を返す ANY クエリがある場合: エラーが発生します。
- これを修正できるダミー クエリはありません。
- function2 に continue_handler_1329 を含める (またはクエリが null を返さないようにする) ことで修正されました。
- function_1 に continue_handler_1329 を含めると、無限ループが発生します。行がなくなった場合、カーソルは独自のハンドラーではなく、新しいハンドラーで終了し、Done = True を設定しません。
バージョンSET2の結論として
- カーソルを使用する関数を除いて、クエリが null を返す可能性があるすべての関数に continue_handler_1329 を追加します。これらには、宣言されたカーソル自体を除いて、null を返すクエリを含めることはできません。ただし、カーソルを使用する関数には、null-returning-query と continue_handler_1329 を持つ別の begin-end スコープが含まれる場合があります。
結論として、両方で機能します。
- null を返すクエリを含む可能性のあるすべての関数に continue_handler_1329 を追加し、Python から呼び出される関数と、カーソルから呼び出される可能性のある関数に最後のダミー クエリを追加します。カーソルを持つ関数には、continue_handler_1329 を含めることも、null を返すクエリを含めることもできません。(カーソル クエリ自体が null を返す場合がありますが、これはカーソルの続行ハンドラーによって処理されます)。