kuchuluk
@kuchuluk

Почему возникает ошибка при INSERT в pymysql на python?

Здравствуйте!
Получаю данные через машину состояний от пользователя, заношу их в словарь. Но при попытке занести их в таблицу базы данных, возникает ошибка TypeError: not enough arguments for format string
Вот более полный текст ошибки:
response = await handler_obj.handler(*args, **partial_data)
File "D:\OpenServer\domains\jobbot.local\handlers\naked.py", line 179, in get_email
await dbusers.addNewApplicant(state)
File "D:\OpenServer\domains\jobbot.local\db\dbusers.py", line 74, in addNewApplicant
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

Код последних двух состояний и записи их в словарь:
@dp.message_handler(state=FSMNewapplicant.phone)
async def get_phone(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        if message.text == 'Пропустить':
            data['phone'] = 'empty'
        else:
            data['phone'] = message.text
    await FSMNewapplicant.next()
    await message.reply("Укажите ваш e-mail адрес (необязательно)\n\nЛибо пропустите шаг", reply_markup=skip_step)

@dp.message_handler(state=FSMNewapplicant.email)
async def get_email(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        if message.text == 'Пропустить':
            data['email'] = 'empty'
        else:
            data['email'] = message.text
    await state.finish()
    await dbusers.addNewApplicant(state)
    successText = '''
    Ваша анкета успешно создана
    '''
    await bot.send_message(message.from_user.id, successText)


Вот код функции addNewApplicant:
async def addNewApplicant (state):
    # Подключиться к базе данных.
    connection = pymysql.connect(host='127.0.0.1',
                                 user='root',
                                 password='admin',
                                 db='testbot',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    print (state)
    # print ("connect successful addNewApplicant!")
    cursor = connection.cursor()
    try:
        async with state.proxy() as data:
            # SQL
            sql = "INSERT INTO `anketa` "\
            "(`tg-id`, `tg-login`, `firstname`, `lastname`, `patronymic`, `line-business`, `line-business-id`, `career-objective`, "\
            "`desired-salary`, `city-work`, `work-experience`, `desired-work-schedule`, `phone`, `email`) "\
            "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
            print(sql)
            # Выполнить команду запроса (Execute Query).
            # есть пользователь с этим ником в базе
            res = cursor.execute(sql, tuple(data.values()))
            connection.commit()
            return res
    finally:
        # Закрыть соединение (Close connection).
        connection.close()
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
@Durilka96
посмотри print(state) или еще как-то сколько именно у тебя в нем аргументов находиться перед самым вызовом функции для занесения в бд, т.к ты жестко задал в SQL запросе какие поля необходимо заполнять, то он ждет чтобы все эти поля присутствовали, а т.к их не хватает вот бд и ноет
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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