Python カーソルはストアド プロシージャから結果を取得できません
P粉833546953
2023-08-24 14:22:59
<p>何らかの奇妙な理由で、Python テスト アプリケーションでの callproc 呼び出しから結果を取得できません。 MqSQL 5.2.47 のストアド プロシージャは次のようになります。 </p>
<pre class="brush:php;toolbar:false;">CREATE PROCEDURE `mytestdb`.`getperson` (IN personid INT)
始める
person.person_id を選択し、
person.person_fname、
person.person_mi、
person.person_lname、
person.persongender_id、
person.personjob_id
人から
ここで、 person.person_id = personid;
END</pre>
<p>PyCharm と Python 3.3 を使用すると、このストアド プロシージャを呼び出しても何も取得できないようです。このコードは私が望む結果を取得します: </p>
<pre class="brush:php;toolbar:false;">mysql.connector をインポート
cnx = mysql.connector.connect(user='root'、host='127.0.0.1'、database='mytestdb')
cnx._open_connection()
カーソル = cnx.cursor()
Cursor.execute("select * from person where person.person_id = 1")
人々 = カーソル.fetchall()
人々の中の人にとって:
プリント(人物)
cnx.close()
<p>しかし、このコードにはcursor.fetchall()またはcursor.fetchone()があります...</p>
<pre class="brush:php;toolbar:false;">mysql.connector をインポート
cnx = mysql.connector.connect(user='root'、host='127.0.0.1'、database='mytestdb')
cnx._open_connection()
カーソル = cnx.cursor()
カーソル.callproc("getperson", [1])
人々 = カーソル.fetchall()
人々の中の人にとって:
プリント(人物)
cnx.close()
<p>...「mysql.connector.errors.InterfaceError: 取得する結果セットがありません。」を返します。cursor.execute() メソッドを使用すると、次のような奇妙な動作が追加されます... </ p>
<pre class="brush:php;toolbar:false;">mysql.connector をインポート
cnx = mysql.connector.connect(user='root'、host='127.0.0.1'、database='mytestdb')
cnx._open_connection()
カーソル = cnx.cursor()
Cursor.execute("getperson(1) を呼び出す")
人々 = カーソル.fetchall()
人々の中の人にとって:
プリント(人物)
cnx.close()
<p> ...これは、実際、複数の結果セットではなく、単一のクエリ結果のみを返します。 MySQL Python コネクタは、ストアド プロシージャへの呼び出しの実行を二重クエリとして扱いますか?ストアド プロシージャを呼び出して結果を取得するにはどうすればよいですか?コード内で動的 SQL を使用したくありません。アドバイスをよろしくお願いします。 </p>
cursor.callproc
を呼び出した後にストアド プロシージャを取得した結果は、次の要因によって異なります。呼び出したプロシージャの結果が INOUT パラメータまたは OUT パラメータに割り当てられるかどうか-
結果が単一の行で構成されているか、結果セット (または複数の結果セット) で構成されているか -
呼び出しに使用する Python パッケージ-
DBAPI仕様 cursor.callproc
実際、Cursor.callproc からの戻り値の使用は、プロシージャが単一行を返し、列の数が INOUT および OUT パラメータの数と一致する場合にのみ機能するため、結果の処理方法がいくつか変更されています。に次のステートメントがあります:
主な MySQL Python コネクタ パッケージ (
MySQL Connector、mysqlclient (MySQLdb)、および PyMySQL) がこれらの状況にどのように対処するかを示します。
INOUT または OUT パラメータを通じて返される単一行の結果
MySQL Connector 入力シーケンスの変更されたコピーを cursor.callproc
の戻り値として返します。値はタプルです。
ああああmysqlclient と PyMySQL では、データベースに出力パラメーターをクエリし、カーソルを介して結果を取得する必要があります。値はタプルのタプルです。クエリされるパラメータ名の形式は '@_{procedure_name}_{params.index(param)}'
です。 ああああ
単一の結果セット内の 1 つ以上の行、INOUT パラメーターまたは OUT パラメーターは定義されていません
MySQL コネクタ カーソルの stored_results メソッド経由 (cursor.stored_results
は DBAPI 仕様の一部ではありません)
ああああmysqlclient と PyMySQL は、カーソルの fetch* メソッドを通じて結果を公開します ああああ
複数の結果セット、INOUT パラメータまたは OUT パラメータが定義されていません
MySQL コネクタ カーソルの stored_results
メソッド
を通じて結果を公開する ああああmysqlclient と PyMySQL は、cursor.nextset を呼び出す前に次の結果セットに進む必要があります。プロシージャの呼び出しの結果として、追加の空の結果セットが返される可能性があることに注意してください (結果セットが cursor.fetchall
を一度だけ呼び出すのではなく、
cursor.nextset 経由で取得された場合)。 ああああ結果セットの 1 つを選択してみましたか?
リーリーSELECT
stmt が 1 つしかない場合でも、複数の結果セットが割り当てられる場合があります。これは、INOUT 変数と OUT 変数を返せるようにするために PHP の MySQLi ストアド プロシージャで行われていることは知っています (繰り返しますが、返されませんが、いずれにせよ割り当てられている可能性があります)。私が使用している (実行している) 完全なコードは次のとおりです:
リーリー