#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) ...
Он создает новую строку в базе данных, но не возвращает мне идентификатор. Это просто выдает мне пустой список []
Ответ №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)
. Последнее значение-это идентификатор, который требуется.
Это своего рода обходной путь, так как я возвращаю всю строку, но я могу с этим работать. Если у кого-то есть лучшее решение моей проблемы, не стесняйтесь поделиться 🙂