ホームページ  >  に質問  >  本文

Python カーソルはストアド プロシージャから結果を取得できません

<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粉833546953P粉833546953422日前579

全員に返信(2)返信します

  • P粉523335026

    P粉5233350262023-08-25 11:31:10

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

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

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

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


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

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

    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

    P粉0054177482023-08-25 10:38:33

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

    リーリー

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

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

    リーリー

    返事
    0
  • キャンセル返事