Atas sebab yang pelik, saya tidak boleh mendapatkan hasil daripada panggilan callproc dalam aplikasi ujian Python. Prosedur tersimpan dalam MqSQL 5.2.47 kelihatan seperti ini:
BUAT PROSEDUR `mytestdb`.`getperson` (IN personid INT) BERMULA pilih person.person_id, person.person_fname, person.person_mi, person.person_lname, person.persongender_id, person.personjob_id daripada orang di mana person.person_id = personid; TAMATSekarang, menggunakan PyCharm dan Python 3.3, saya nampaknya tidak dapat mendapatkan apa-apa apabila memanggil prosedur tersimpan ini. Kod ini mendapat hasil yang saya mahu:
import mysql.connector cnx = mysql.connector.connect(pengguna='root', hos='127.0.0.1', pangkalan data='mytestdb') cnx._open_connection() kursor = cnx.cursor() cursor.execute("select * from person where person.person_id = 1") orang = cursor.fetchall() untuk orang dalam orang: cetak(orang) cnx.close()Tetapi kod ini mempunyai cursor.fetchall() atau cursor.fetchone()...
import mysql.connector cnx = mysql.connector.connect(pengguna='root', hos='127.0.0.1', pangkalan data='mytestdb') cnx._open_connection() kursor = cnx.cursor() cursor.callproc("getperson", [1]) orang = cursor.fetchall() untuk orang dalam orang: cetak(orang) cnx.close()...mengembalikan "mysql.connector.errors.InterfaceError: Tiada keputusan yang ditetapkan untuk diperolehi daripada." p>
import mysql.connector cnx = mysql.connector.connect(pengguna='root', hos='127.0.0.1', pangkalan data='mytestdb') cnx._open_connection() kursor = cnx.cursor() cursor.execute("call getperson(1)") orang = cursor.fetchall() untuk orang dalam orang: cetak(orang) cnx.close()...kerana ia menghasilkan "mysql.connector.errors.InterfaceError: menggunakan cmd_query_iter untuk pernyataan dengan berbilang pertanyaan" diikuti dengan "mysql.connector.errors.InterfaceError: menggunakan multi=True apabila melaksanakan berbilang pernyataan ", walaupun fakta bahawa saya hanya mengembalikan satu hasil pertanyaan dan bukannya beberapa set hasil. Adakah penyambung MySQL Python menganggap pelaksanaan panggilan ke prosedur tersimpan sebagai pertanyaan berganda? Bagaimanakah cara saya memanggil prosedur tersimpan dan mendapatkan hasilnya? Saya benar-benar tidak mahu menggunakan SQL dinamik dalam kod saya. Terima kasih terlebih dahulu untuk sebarang nasihat!
Mendapatkan hasil prosedur tersimpan selepas membuat panggilan
cursor.callproc
bergantung pada faktor berikut:DBAPISpesifikasidalam
上有这样的说法光标.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) danPyMySQL.
Hasil baris tunggal, dikembalikan melalui parameter INOUT atau OUT
MySQL Connectormengembalikan salinan urutan input yang diubah suai sebagai nilai pulangan
cursor.callproc
;mysqlclientdanPyMySQLmemerlukan pertanyaan pangkalan data untuk parameter output dan kemudian mendapatkan hasil melalui kursor; Nama parameter untuk ditanya adalah dalam bentuk
'@_{procedure_name}_{params.index(param)}'
Satu atau lebih baris dalam set hasil tunggal, tiada parameter INOUT atau OUT ditentukan
MySQL Connectormelalui kaedahstored_resultskursor (
cursor.stored_results
bukan sebahagian daripada spesifikasi DBAPI)mysqlclientdanPyMySQLdedahkan hasil melalui kaedah pengambilan* kursor
Berbilang set hasil, tiada parameter INOUT atau OUT ditentukan
MySQL Connectormendedahkan hasil melalui kaedah
stored_results
kursormysqlclientdanPyMySQLmemerlukan panggilancursor.nextsetuntuk 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).Maklumat versi
Sudahkah anda mencuba memilih salah satu set hasil?
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: