es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamar a fetchall() después de ejecutar un procedimiento almacenado me devuelve una lista vacía.

Tengo este procedimiento almacenado:

CREATE DEFINER=`user`@`%` PROCEDURE `create_merkmal`(IN malter int, IN geschlecht tinyint(1), IN groesse int, IN Tier_tierID int)
BEGIN
   insert into Merkmal(malter ,  geschlecht , groesse, Tier_tierID)
   values (malter ,  geschlecht , groesse, Tier_tierID);
   SELECT LAST_INSERT_ID();
END

La ID de Merkmal está configurada para AutoIncremento.
Y el procedimiento almacenado funciona bien. Crea una nueva entrada en la base de datos y devuelve la ID cuando lo llamo en MySQL Workbench de la siguiente manera:

CALL create_merkmal(4,1,33,0);

Pero cuando intento usar este procedimiento en Python con Flask y mysql.connector:

...

def callSoredProcReturn(procName, data):
    try:
        myDatabase = mysql.connector.connect(**dbLoginInfo)
        cursor = myDatabase.cursor()
    except mysql.connector.Error as e:
        print('ERROR AL CONECTARSE A LA BASE DE DATOS:', e)
    else:

        cursor.callproc(procName, data)
        reVal = cursor.fetchall()

        myDatabase.commit()
        cursor.close()
        myDatabase.close()

        return reVal



@app.route("/perfil/create", methods= ['POST'])
def addEntry():
   try:

       merkmalID = callSoredProcReturn('create_merkmal', (13,1,444,0))
       print(merkmalID)

   except mysql.connector.Error as e:  
        print(e) 
        return abort(400, '[ERROR]: '+str(e))

   return Response(status=200)

...

Crea una nueva fila en la base de datos pero no me devuelve la ID. Solo me imprime una lista vacía [].

La estructura de la tabla Merkmal se encuentra aquí: https://i.stack.imgur.com/38zfX.png

Tags:  

Answer

  1. Avatar for davy.ai

    Solución:

    El problema está en la llamada al método fetchall() después de llamar al procedimiento almacenado en la función callSoredProcReturn(). En este caso, el procedimiento almacenado devuelve solo un valor: el ID de la nueva fila creada. Sin embargo, el método fetchall() intenta buscar todas las filas devueltas por el procedimiento almacenado (en este caso, solo una fila) y devuelve una lista vacía si no hay filas devueltas.

    Para solucionar esto, podemos simplemente usar el método fetchone() en lugar de fetchall() para recuperar el único valor devuelto por el procedimiento almacenado. Aquí está la función callSoredProcReturn() modificada:

    def callSoredProcReturn(procName, data):
        try:
            myDatabase = mysql.connector.connect(**dbLoginInfo)
            cursor = myDatabase.cursor()
        except mysql.connector.Error as e:
            print('[ERROR AL CONECTAR A LA BASE DE DATOS]: ', e)
        else:
    
            cursor.callproc(procName, data)
            reVal = cursor.fetchone()[0]  # usar fetchone() en lugar de fetchall()
    
            myDatabase.commit()
            cursor.close()
            myDatabase.close()
    
            return reVal
    

    Con esta modificación, la variable merkmalID en la función addEntry() ahora debería contener el ID de la nueva fila creada, y debería imprimir el valor correcto.

Comments are closed.