Вызов функции fetchall() после выполнения хранимой процедуры возвращает мне пустой список

#mysql-connector-python

Вопрос:

У меня есть эта хранимая процедура:

 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  

Идентификатор Merkmal установлен в значение автоинкремента. И хранимая процедура работает нормально. Он создает новую запись в базе данных и возвращает идентификатор, когда я вызываю его в mysql Workbench, как это:

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

Но когда я пытаюсь использовать эту процедуру в Python с помощью Flask и mysql.connector:

 ...  def callSoredProcReturn(procName, data):  try:  myDatabase = mysql.connector.connect(**dbLoginInfo)  cursor = myDatabase.cursor()  except mysql.connector.Error as e:  print('[ERROR WHILE CONNECTING TO DATABASE]: ', e)  else:    cursor.callproc(procName, data)  reVal = cursor.fetchall()    myDatabase.commit()  cursor.close()  myDatabase.close()    return reVal    @app.route("/profil/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)  ...  

Он создает новую строку в базе данных, но не возвращает мне идентификатор. Это просто выдает мне пустой список []

Структура таблицы Merkmal

Ответ №1:

Хорошо, теперь моя хранимая процедура выглядит так:

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

и мой Код:

 def callSoredProcReturn(procName, data):  try:  myDatabase = mysql.connector.connect(**dbLoginInfo)  cursor = myDatabase.cursor()  except mysql.connector.Error as e:  print('[ERROR WHILE CONNECTING TO DATABASE]: ', e)  else:    reVal = cursor.callproc(procName, data)  #reVal = cursor.fetchone()    myDatabase.commit()  cursor.close()  myDatabase.close()    return reVal   @app.route("/profil/create", methods= ['POST']) def addEntry():  json = request.get_json()  print(type(json))  print(json)  print('----------')  print( json['profilInfo']['profilName'])  try:    merkmalID = callSoredProcReturn('create_merkmal', (13,1,666,0,0))  print(merkmalID)    except mysql.connector.Error as e:   print(e)   return abort(400, '[ERROR]: ' str(e))    return Response(status=200)  

Выход (13, 1, 666, 0, 25) . Последнее значение-это идентификатор, который требуется.

Это своего рода обходной путь, так как я возвращаю всю строку, но я могу с этим работать. Если у кого-то есть лучшее решение моей проблемы, не стесняйтесь поделиться 🙂