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
davy.ai
Solución:
El problema está en la llamada al método
fetchall()
después de llamar al procedimiento almacenado en la funcióncallSoredProcReturn()
. En este caso, el procedimiento almacenado devuelve solo un valor: el ID de la nueva fila creada. Sin embargo, el métodofetchall()
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 defetchall()
para recuperar el único valor devuelto por el procedimiento almacenado. Aquí está la funcióncallSoredProcReturn()
modificada:Con esta modificación, la variable
merkmalID
en la funciónaddEntry()
ahora debería contener el ID de la nueva fila creada, y debería imprimir el valor correcto.