No se pueden devolver los resultados del procedimiento almacenado utilizando el cursor de Python

Por alguna extraña razón, no puedo obtener resultados de una llamada de callproc en una aplicación de prueba de Python. El procedimiento almacenado en MqSQL 5.2.47 se ve así:

CREATE PROCEDURE `mytestdb`.`getperson` (IN personid INT) BEGIN select person.person_id, person.person_fname, person.person_mi, person.person_lname, person.persongender_id, person.personjob_id from person where person.person_id = personid; END 

Ahora, al usar PyCharm con Python 3.3, parece que no puedo recuperar nada al llamar a este procedimiento almacenado. Este código me da los resultados deseados:

 import mysql.connector cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') cnx._open_connection() cursor = cnx.cursor() cursor.execute("select * from person where person.person_id = 1") people = cursor.fetchall() for person in people: print(person) cnx.close() 

Pero este código con cursor.fetchall () o cursor.fetchone () …

 import mysql.connector cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') cnx._open_connection() cursor = cnx.cursor() cursor.callproc("getperson", [1]) people = cursor.fetchall() for person in people: print(person) cnx.close() 

… devuelve “mysql.connector.errors.InterfaceError: No hay ningún conjunto de resultados para obtener”. Hay un comportamiento extraño adicional utilizando el método cursor.execute () como …

 import mysql.connector cnx = mysql.connector.connect(user='root', host='127.0.0.1', database='mytestdb') cnx._open_connection() cursor = cnx.cursor() cursor.execute("call getperson(1)") people = cursor.fetchall() for person in people: print(person) cnx.close() 

… porque produce “mysql.connector.errors.InterfaceError: Use cmd_query_iter para declaraciones con múltiples consultas” seguido de “mysql.connector.errors.InterfaceError: Use multi = True cuando ejecute varias declaraciones” a pesar del hecho de que estoy solo se devuelve un resultado de consulta en lugar de varios conjuntos de resultados. ¿Está el conector Python de MySQL tratando la llamada de ejecución en el procedimiento almacenado como una consulta doble? ¿Cómo puedo llamar al procedimiento almacenado y recuperar mis resultados? Realmente no quiero SQL dynamic en mi código. Gracias de antemano por cualquier consejo!

¿Has intentado elegir uno de los resultados?

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

Podría ser que se esté asignando para múltiples conjuntos de resultados, aunque solo tenga un comando SELECT . Sé que en los procedimientos almacenados de MySQLi de PHP haga esto para permitir los rendimientos de las variables INOUT y OUT (que, de nuevo, no tiene ninguno, pero tal vez esté asignando de todos modos).

El código completo que estoy usando (que está funcionando) es:

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

¿Por qué no intentarlo de esta manera?

 cursor.callproc("getperson", ['1'])