Rumah > Soal Jawab > teks badan
P粉5233350262023-08-25 11:31:10
Mendapatkan hasil prosedur tersimpan selepas membuat panggilan cursor.callproc
bergantung pada faktor berikut:
DBAPI Spesifikasi dalam 上有这样的说法光标.callproc
:
Malah, menggunakan nilai pulangan daripada Cursor.callproc hanya berfungsi jika prosedur mengembalikan satu baris dan bilangan lajur sepadan dengan bilangan parameter INOUT dan OUT, jadi terdapat beberapa perubahan dalam cara keputusan dikendalikan.
Begini cara pakej penyambung MySQL Python utama mengendalikan situasi ini - MySQL Connector, mysqlclient (MySQLdb)< /a> dan PyMySQL. < /p>
Hasil baris tunggal, dikembalikan melalui parameter INOUT atau OUT
MySQL Connector mengembalikan salinan urutan input yang diubah suai sebagai nilai pulangan cursor.callproc
;
params = [in_param, out_param1, out_param2] in_, out1, out2 = cursor.callproc("test_proc", params)
mysqlclient dan PyMySQL memerlukan pertanyaan pangkalan data untuk parameter output dan kemudian mendapatkan hasil melalui kursor; Nama parameter untuk ditanya adalah dalam bentuk '@_{procedure_name}_{params.index(param)}'
cursor.callproc("test_proc", params) cursor.execute("""SELECT @_test_proc_0, @_test_proc_1""") result = cursor.fetchall()
Satu atau lebih baris dalam set hasil tunggal, tiada parameter INOUT atau OUT ditentukan
MySQL Connector melalui kaedah stored_results kursor (cursor.stored_results
bukan sebahagian daripada spesifikasi DBAPI)
cursor.callproc("test_proc", params) results = [r.fetchall() for r in cursor.stored_results()]
mysqlclient dan PyMySQL dedahkan hasil melalui kaedah pengambilan* kursor
cursor.callproc("test_proc", params) results = cursor.fetchall()
Berbilang set hasil, tiada parameter INOUT atau OUT ditentukan
MySQL Connector mendedahkan hasil melalui kaedah stored_results
kursor
cursor.callproc("test_proc", params) results = [r.fetchall() for r in cursor.stored_results()]
mysqlclient dan PyMySQL memerlukan panggilan cursor.nextset untuk mara ke set keputusan seterusnya. Ambil perhatian bahawa set hasil kosong tambahan mungkin dikembalikan, yang merupakan hasil daripada memanggil prosedur (jika cursor.nextset
检索结果集而不是仅调用 <代码>cursor.fetchall diluluskan sekali).
cursor.callproc("test_proc", params) results = [cursor.fetchall()] while cursor.nextset(): results.append(cursor.fetchall())
Maklumat versi
$ mysql --version mysql Ver 15.1 Distrib 10.1.41-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2 $ pip list | grep -i mysql mysql-connector-python 8.0.18 mysqlclient 1.4.6 PyMySQL 0.9.3
P粉0054177482023-08-25 10:38:33
Sudahkah anda mencuba memilih salah satu set hasil?
for result in cursor.stored_results(): people = result.fetchall()
Walaupun anda hanya mempunyai satu SELECT
stmt, ia mungkin memperuntukkan beberapa set hasil. Saya tahu ini dilakukan dalam prosedur tersimpan MySQLi PHP untuk membenarkan pembolehubah INOUT dan OUT dikembalikan (sekali lagi, anda tidak melakukannya, tetapi mungkin ia diperuntukkan pula).
Kod lengkap yang saya gunakan (berjalan) ialah:
import mysql.connector cnx = mysql.connector.connect(user='me',password='pw',host='localhost',database='mydb') cnx._open_connection() cursor = cnx.cursor() cursor.callproc("getperson",[1]) for result in cursor.stored_results(): people=result.fetchall() for person in people: print person cnx.close()