Kursor Python tidak boleh mendapatkan hasil daripada prosedur tersimpan
P粉833546953
P粉833546953 2023-08-24 14:22:59
0
2
545

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; TAMAT 

Sekarang, 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!

P粉833546953
P粉833546953

membalas semua (2)
P粉523335026

Mendapatkan hasil prosedur tersimpan selepas membuat panggilancursor.callprocbergantung pada faktor berikut:

  • Sama ada hasil prosedur panggilan diberikan kepada parameter INOUT atau OUT
  • Sama ada keputusan terdiri daripada satu baris atau set hasil (atau beberapa set hasil)
  • Python pakej untuk membuat panggilan

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 pulangancursor.callproc;

    params = [in_param, out_param1, out_param2] in_, out1, out2 = cursor.callproc("test_proc", params)
  • 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)}'

    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 Connectormelalui kaedahstored_resultskursor (cursor.stored_resultsbukan sebahagian daripada spesifikasi DBAPI)

    cursor.callproc("test_proc", params) results = [r.fetchall() for r in cursor.stored_results()]
  • mysqlclientdanPyMySQLdedahkan hasil melalui kaedah pengambilan* kursor

    cursor.callproc("test_proc", params) results = cursor.fetchall()

Berbilang set hasil, tiada parameter INOUT atau OUT ditentukan

  • MySQL Connectormendedahkan hasil melalui kaedahstored_resultskursor

    cursor.callproc("test_proc", params) results = [r.fetchall() for r in cursor.stored_results()]
  • mysqlclientdanPyMySQLmemerlukan panggilancursor.nextsetuntuk mara ke set keputusan seterusnya. Ambil perhatian bahawa set hasil kosong tambahan mungkin dikembalikan, yang merupakan hasil daripada memanggil prosedur (jikacursor.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粉005417748

    Sudahkah anda mencuba memilih salah satu set hasil?

    for result in cursor.stored_results(): people = result.fetchall()

    Walaupun anda hanya mempunyai satuSELECTstmt, 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()
      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!