kuchuluk
@kuchuluk

Почему в моем коде возникают ошибки Task exception was never retrieved и Traceback (most recent call last)?

Аналогичный код по записи в базу данных у меня в другом месте работает, но данный выдает ошибки. Сначала в машине состояний пишу данные в data:
data['lineBuissName'] = oneLineBusinessInfo[0]['name']
data['lineBuissId'] = int(oneLineBusinessInfo[0]['id'])
print(data)
compId = await dbcompanies.addNewCompany(state)
await state.finish()
successText = '''
Успешно зарегестрированы
'''

В этом месте когда вывожу print-ом data, то там все значения есть. Затем код функции addNewCompany:
async def addNewCompany (state):
    # Подключиться к базе данных.
    connection = pymysql.connect(host='127.0.0.1',
                                 user='root',
                                 password='015153771Fast',
                                 db='jobbot',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    print ("connect successful addNewCompany!")
    cursor = connection.cursor()
    try:
        async with state.proxy() as data:
            print(data)
            # SQL
            sql = "INSERT INTO `companies` "\
            "(`tg-id`, `tg-login`, `company-name`, `line-business`, `line-business-id`) "\
            "VALUES (%s, %s, %s, %s, %s)"
            # Выполнить команду запроса (Execute Query).
            # есть пользователь с этим ником в базе
            res = cursor.execute(sql, tuple(data.values()))
            connection.commit()
            return res
    finally:
        # Закрыть соединение (Close connection).
        connection.close()

И вот здесь, когда вывожу print-ом data, то уже последних двух значений почему-то нет.

И возникают такие ошибки:
Task exception was never retrieved
future: exception=TypeError('not enough arguments for format string')>
Traceback (most recent call last):
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
return await asyncio.gather(*tasks)
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
return await self.message_handlers.notify(update.message)
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\aiogram\dispatcher\handler.py", line 116, in notify
response = await handler_obj.handler(*args, **partial_data)
File "D:\OpenServer\domains\jobbot.local\handlers\naked.py", line 366, in get_linebuiss
compId = await dbcompanies.addNewCompany(state)
File "D:\OpenServer\domains\jobbot.local\db\dbcompanies.py", line 45, in addNewCompany
res = cursor.execute(sql, tuple(data.values()))
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\pymysql\cursors.py", line 146, in execute
query = self.mogrify(query, args)
File "D:\OpenServer\domains\jobbot.local\venv\lib\site-packages\pymysql\cursors.py", line 125, in mogrify
query = query % self._escape_args(args, conn)
TypeError: not enough arguments for format string
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
igorzakhar
@igorzakhar
В строке запроса:
sql = "INSERT INTO `companies` "\
"(`tg-id`, `tg-login`, `company-name`, `line-business`, `line-business-id`) "\
"VALUES (%s, %s, %s, %s, %s)"

с именами полей ты используешь символ "гравис" (grave accent, ASCII code 96), а его нельзя использовать в качестве одинарных кавычек.

Также тебе нужно задуматься над комментарием Dr. Bacon:

ну и глобальная проблема, у тебя async код, но с базой ты работаешь в синхронном режиме, эти моменты будут всегда блокировать event loop и никакой пользы от async ты не получишь
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы