@voldemar21

Почему выдает ошибку о неправильном количестве привязок?

Столкнулся с такой ошибкой:

Incorrect number of bindings supplied. The current statement uses 3, and there are 2 supplied.

Вопрос в том, из-за чего, в чем причина и как это решается. Ошибку выдает на этой строке:

self.cursor.execute('INSERT INTO `task_list` (`users_id`, `date`, `task`) VALUES (?, ?, ?)', (self.get_user_id(user_id), tuple(data.values())))

Но если убрать вот этот аргумент self.get_user_id(user_id), то в базу все пишется нормально, за исключением user_id. Мне просто надо реализовать запись во вторую таблицу user_id из первой таблицы.

Код класса базы данных
import sqlite3


class DBot:
    def __init__(self, database):
        self.connection = sqlite3.connect(database)
        self.cursor = self.connection.cursor()
        if self.connection:
            print ("База данных подключена")
    # Проверяем, есть ли уже юзер в базе
    def user_exists(self, user_id):
            result = self.cursor.execute("SELECT `id` FROM `user` WHERE `user_id` = ?", (user_id,))
            return bool (len(result.fetchall()))
    # Достаем id в базе данных по его user_id
    def get_user_id (self, user_id):
            result = self.cursor.execute("SELECT `id` FROM `user` WHERE `user_id` = ?", (user_id,))
            return result.fetchone()[0]
    #Добавляем юзера в базу
    def add_user(self, user_id):
        self.cursor.execute("INSERT INTO `user` (`user_id`) VALUES (?)", (user_id,))
        return self.connection.commit()
    # Создаем запись в task_list о полученных задачах
    #staticmethod
    async def sql_add_command (self, user_id, state):
        async with state.proxy() as data:
            #tasks = ((self.get_user_id(user_id)), (data.values()),)
            #self.cursor.execute('INSERT INTO `task_list` (`users_id`, `date`, `task`)VALUES (?, ?, ?)', (self.get_user_id(user_id), tuple(data.values())),)
            self.cursor.execute('INSERT INTO `task_list` (`users_id`, `date`, `task`) VALUES (?, ?, ?)', (self.get_user_id(user_id), tuple(data.values())))
            return self.connection.commit()
    def close(self):
        """Закрываем соединение с БД"""
        self.connection.close()

Код машины состояний на aiogram
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram import types, Dispatcher
from aiogram.types import message
from aiohttp.helpers import current_task
from config import bot, dp
from aiogram.dispatcher.filters import Text
from bot import DBot
from client_kb import kb_client



@dp.message_handler(commands=['start', 'help'])
async def command_start (message: types.Message):
    if (not DBot.user_exists(message.from_user.id)):
        DBot.add_user(message.from_user.id)
    await bot.send_message(message.from_user.id, "Добрый день", reply_markup=kb_client)

class FSAdmin(StatesGroup):
    dates = State()
    task = State()


# Выход из состояний
@dp.message_handler(state="*", commands="отмена")
@dp.message_handler(Text(equals="отмена", ignore_case=True), state="*")
async def cancel_handler(message: types.Message, state: FSMContext):
    current_state = await state.get_state()
    if current_state is None:
        return
    await state.finish()
    await message.reply("Отменено")


# Начало диалога с пользователем
@dp.message_handler(commands="добавить_задачу")
async def cm_start(message: types.Message):
        await FSAdmin.dates.set()
        await message.reply("Укажите дату")

# Ловим дату задачи
@dp.message_handler(state=FSAdmin.dates)
async def load_dates(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
            data["data"] = message.text
    await FSAdmin.next()
    await message.reply ("Введите описание задачи")

# Ловим состав задачи
@dp.message_handler(state=FSAdmin.task)
async def load_task(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
            data["task"] = message.text
            await message.reply ("Задача сохранена")

    await DBot.sql_add_command(message.from_user.id, state)
    await state.finish()
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Всё логично, вы пытаетесь в три поля user_id, data и task передать два значения - что-то возвращённое вызововм метода self.get_user_id(user_id) и кортеж из data.values().
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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