@AirronBark

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

Делаю телеграмм бота c функцией регистрации. *UPD:Библиотека используемая в проекте - aiogram
В случае, если пользователь новый ему предлагают пройти регистрацию, но при этом id user передается в базу данных, а вот остальные записи не добавляются в базу данных, такие как имя, телефон, почта. Ошибок никаких не выдает, при этом бот работает, принимает сообщения и отвечает. Не понимаю почему не передается сообщение в базу данных. Прошу помочь с этим.

main file:

db = THEPARALLEL_DB('35thparallelClientBase.db')

class FSMRegistration (StatesGroup):
    cl_name= State()
    cl_phone=State()
    cl_email=State()


@dp.callback_query_handler(text='reg')
@dp.callback_query_handler(text='cansel_1')
async def registration(query: types.CallbackQuery):
    answ_data = query.data
    if answ_data == 'reg':
        if (not db.client_exists(query.from_user.id)):
            await bot.send_message(query.from_user.id, text=f'Хорошо, начнем регистрацию, для начала регистрации напишите: далее')
@dp.message_handler(Text(equals='далее', ignore_case=True), state=None)
async def reg_start(message: types.Message):
    await FSMRegistration.cl_name.set()
    await message.reply('Ваша Фамилия и Имя:')
    if (len(message.text) > 20):
        await message.reply(
            ('Имя и фамилия не должны превышать больше 20 символов'))
    elif '@' in message.text or '/' in message.text or '?' in message.text or '#' in message.text or '$' in message.text or '%' in message.text:
        await message.reply(message.from_user.id, "Вы ввели запрещенный символ")
    else:
        db.add_client(message.from_user.id)
        pass
@dp.message_handler(state="*", commands='отмена')
@dp.message_handler(Text(equals='отмена', ignore_case=True), state="*")
async def cansel_handler(message: types.Message, state: FSMContext, current_state=None):
    current_state * await state.get_state()
    if current_state is None:
        return
    await state.finish()
    await message.reply('Ok!')


@dp.message_handler(state=FSMRegistration.cl_name)
async def set_cl_name(message: types.Message, state:FSMContext):
    async with state.proxy() as data:
        db.set_client_name(message.from_user.id, message.text)
        data['cl_name']=message.text
        await FSMRegistration.next() #Ожидание ответа юзера
        await message.reply("Отлично! Теперь введите Ваш номер моб. телефона:")

@dp.message_handler(state=FSMRegistration.cl_phone)
async def set_cl_phone(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        if (len(message.text) > 12):
            await message.reply(('Слишком много знаков! (не используйте + и другие символы, а также пробелы между цифрами)'))
        elif int(message.text):
            data['cl_phone'] = message.text
            db.set_client_phone(message.from_user.id, message.text)
            await FSMRegistration.next()
            await message.reply("Отлично, остался решающий шаг! Прошу ввести Ваш email:")

@dp.message_handler(state=FSMRegistration.cl_email)
async def set_cl_email(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        if '@' not in message.text and '.' not in message.text:
            await message.reply(
            ('Думаю здесь не хватает собаки(@)'))
        else:
            data['cl_email'] = message.text
            db.set_client_email(message.from_user.id, message.text)
            await message.reply("Спасибо за регистрацию, пора в главное меню!")
            await state.finish()


database:
class THEPARALLEL_DB():
    def __init__(self, database_file):
        """Подключаемся к Базе Данных и сохраняем курсор соединения"""
        self.connection = sqlite3.connect(database_file)
        self.cursor=self.connection.cursor()


    def client_exists(self, user_id):
        """Проверяем есть ли клиент уже в базе данных"""
        with self.connection:
            result = self.cursor.execute("SELECT * FROM 'clients' WHERE 'user_id' = ?", (user_id,)).fetchall()
            return bool(len(result))

    def get_user_id (self, user_id):
        result = self.cursor.execute("SELECT 'id' FROM 'clients' WHERE 'user_id'= ?", (user_id,))
        return result.fetchall()[0]

    def add_client(self, user_id):
        """Добавляем нового клиента в базу"""
        with self.connection:
            return self.cursor.execute("INSERT INTO 'clients' ('user_id') VALUES (?)", (user_id,))

    def set_client_name(self, user_id, client_name):
        with self.connection:
            return self.cursor.execute("UPDATE 'clients' SET 'client_name' = ? WHERE 'user_id' = ?",
                                       (client_name, user_id,))

    def set_client_phone(self, user_id, cl_phone):
        with self.connection:
            return self.cursor.execute("UPDATE 'clients' SET 'Телефон' = ?  WHERE 'user_id' = ?", (user_id, cl_phone,))

    def set_client_email(self, user_id, cl_email):
        with self.connection:
            return self.cursor.execute("UPDATE 'clients' SET 'Email' = ? WHERE 'user_id' = ?", (user_id, cl_email,))
  • Вопрос задан
  • 447 просмотров
Решения вопроса 1
@AirronBark Автор вопроса
Спасибо всем. Также помогли на StuckOverflow.
Ответ на SO
Согласно комментариям и ответам изменил код таким образом и все работает:

def set_client_name(self, user_id, client_name: str):
        return self.connection.execute("""UPDATE clients SET client_name = ? WHERE user_id = ?""",
                                       (client_name, user_id,)) and self.connection.commit()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@mcjohnyx
Чел..
В sql нужно делать commit после каждого изменения
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы