Rumah  >  Soal Jawab  >  teks badan

Kursor Python tidak boleh mendapatkan hasil daripada prosedur tersimpan

<p>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: </p> <pre class="brush:php;toolbar:false;">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</pra> <p>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: </p> <pre class="brush:php;toolbar:false;">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()</pre> <p>Tetapi kod ini mempunyai cursor.fetchall() atau cursor.fetchone()...</p> <pre class="brush:php;toolbar:false;">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()</pre> <p>...mengembalikan "mysql.connector.errors.InterfaceError: Tiada keputusan yang ditetapkan untuk diperolehi daripada." p> <pre class="brush:php;toolbar:false;">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()</pre> <p> ...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>
P粉833546953P粉833546953422 hari yang lalu583

membalas semua(2)saya akan balas

  • P粉523335026

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

    Mendapatkan hasil prosedur tersimpan selepas membuat panggilan cursor.callproc bergantung 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

    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

    balas
    0
  • P粉005417748

    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()

    balas
    0
  • Batalbalas