Python カーソルはストアド プロシージャから結果を取得できません
P粉833546953
P粉833546953 2023-08-24 14:22:59
0
2
644
<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>
P粉833546953
P粉833546953

全員に返信(2)
P粉523335026

cursor.callproc を呼び出した後にストアド プロシージャを取得した結果は、次の要因によって異なります。

    呼び出したプロシージャの結果が INOUT パラメータまたは OUT パラメータに割り当てられるかどうか
  • 結果が単一の行で構成されているか、結果セット (または複数の結果セット) で構成されているか
  • 呼び出しに使用する Python パッケージ
DBAPI

仕様 cursor.callprocに次のステートメントがあります:

実際、Cursor.callproc からの戻り値の使用は、プロシージャが単一行を返し、列の数が INOUT および OUT パラメータの数と一致する場合にのみ機能するため、結果の処理方法がいくつか変更されています。


主な MySQL Python コネクタ パッケージ (

MySQL Connectormysqlclient (MySQLdb)、および PyMySQL) がこれらの状況にどのように対処するかを示します。

INOUT または OUT パラメータを通じて返される単一行の結果

  • MySQL Connector 入力シーケンスの変更されたコピーを cursor.callproc の戻り値として返します。値はタプルです。 ああああ

  • mysqlclientPyMySQL では、データベースに出力パラメーターをクエリし、カーソルを介して結果を取得する必要があります。値はタプルのタプルです。クエリされるパラメータ名の形式は '@_{procedure_name}_{params.index(param)}' です。 ああああ

単一の結果セット内の 1 つ以上の行、INOUT パラメーターまたは OUT パラメーターは定義されていません

  • MySQL コネクタ カーソルの stored_results メソッド経由 (cursor.stored_results は DBAPI 仕様の一部ではありません) ああああ

  • mysqlclientPyMySQL は、カーソルの fetch* メソッドを通じて結果を公開します ああああ

複数の結果セット、INOUT パラメータまたは OUT パラメータが定義されていません

###バージョン情報### リーリー
いいねを押す +0
P粉005417748

結果セットの 1 つを選択してみましたか?

リーリー

SELECT stmt が 1 つしかない場合でも、複数の結果セットが割り当てられる場合があります。これは、INOUT 変数と OUT 変数を返せるようにするために PHP の MySQLi ストアド プロシージャで行われていることは知っています (繰り返しますが、返されませんが、いずれにせよ割り当てられている可能性があります)。

私が使用している (実行している) 完全なコードは次のとおりです:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート