Вариативность добавления в БД значений, в зависимости от предыдущего действия пользователя

Рейтинг: 0Ответов: 1Опубликовано: 16.07.2023

При попытке подключения к БД sqlite3 возникла проблема с записью значений от пользователя в таблицу, так как в боте имеется вариативность на получение значений от пользователя - 6 штук в сумме, в то время как записывать планируется из них лишь 3 (в каждом из 2-х вариантов записи)

В зависимости от выбора пользователя "Обратный звонок" или "Записаться сейчас", будут записаны три разных ключа в обоих случаях. В первой ситуации, 'name', 'phone', 'time'; и 'cur_name', 'cur_phone', 'cur_time', соответственно.

В таблице ошибок нет, записей кроме user_id тоже нет. Единственное сообщение об ошибке имеется в pycharm'е: KeyError: 'cur_name'

Просьба подсказать, каким образом и где правильнее указать условие данной записи

На данный момент код выглядит следующим образом:

Код для БД:

import sqlite3 as sq


async def db_start():
global db, cur

db = sq.connect('first.db')
cur = db.cursor()

cur.execute("CREATE TABLE IF NOT EXISTS profile(user_id TEXT PRIMARY KEY, name TEXT, phone TEXT, time TEXT, cur_name TEXT, cur_phone TEXT, cur_time TEXT)")

db.commit()


async def create_profile(user_id):
user = cur.execute("SELECT 1 FROM profile WHERE user_id == '{key}'".format(key=user_id)).fetchone()
if not user:
    cur.execute("INSERT INTO profile VALUES(?, ?, ?)", (user_id, '', '', ''))
    db.commit()


async def edit_profile(state, user_id):
async with state.proxy() as data:
    cur.execute("UPDATE profile SET name = '{}', phone = '{}', time = '{}', cur_name = '{}', cur_phone = '{}', cur_time = '{}' WHERE user_id == '{}'".format(
        data['name'], data['phone'], data['time'], data['cur_name'], data['cur_phone'], data['cur_time'], user_id))
    db.commit()

Код бота:

storage = MemoryStorage()
bot = Bot('6031580210:AAH9XcHzZPMHAW0vWAtbZBM5F8p8tnLNhf0')
dp = Dispatcher(bot, storage=MemoryStorage())


async def on_startup(_):
await db_start()


class ProfileStatesGroup(StatesGroup):
name = State()
phone = State()
time = State()
cur_name = State()
cur_phone = State()
cur_time = State()


def get_ikb_start():
ikb_start = InlineKeyboardMarkup(inline_keyboard=[
    [InlineKeyboardButton('Запись', callback_data='record'),
     InlineKeyboardButton('Контакты', callback_data='contacts')],
    [InlineKeyboardButton('О нас', callback_data='about')]
])

return ikb_start


def get_ikb_appointment_type():
ikb_appointment = InlineKeyboardMarkup(inline_keyboard=[
    [InlineKeyboardButton('Обратный звонок', callback_data='call'),
     InlineKeyboardButton('Записаться сейчас', callback_data='currently')],
    [InlineKeyboardButton('Назад', callback_data='cancel')]
])

return ikb_appointment


def cancel_kb():
kb = ReplyKeyboardMarkup(resize_keyboard=True)
kb.add(KeyboardButton('Отмена'))

return kb


@dp.callback_query_handler(lambda c: c.data == 'cancel')
async def get_info(callback_query: types.CallbackQuery):
await bot.send_message(callback_query.from_user.id, 'Вы прервали процесс записи\n Выберите пожалуйста, что Вас интересует',
                       reply_markup=get_ikb_start())


@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
await message.answer(f"Добро пожаловать! \nВыберите пожалуйста необходимую для Вас функцию: ",
                     reply_markup=get_ikb_start())
await create_profile(user_id=message.from_user.id)


@dp.callback_query_handler(lambda c: c.data == 'record')
async def get_record(callback_query: types.CallbackQuery):
await bot.send_message(callback_query.from_user.id, 'Выберите удобный для Вас вариант записи',
                       reply_markup=get_ikb_appointment_type())


@dp.callback_query_handler(lambda c: c.data == 'call')
async def get_call(callback_query: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
    data["data_call"] = callback_query.data

await bot.send_message(callback_query.from_user.id, text='Введите пожалуйста Ваше имя и фамилию',
                       reply_markup=cancel_kb())
await ProfileStatesGroup.next()


@dp.message_handler(lambda message: not message.text.isdigit(), 
state=ProfileStatesGroup.phone)
async def check_phone(message: types.Message):
await message.reply('Вы ввели некорректный номер телефона, попробуйте снова',
                    reply_markup=cancel_kb())


@dp.message_handler(state=ProfileStatesGroup.name)
async def get_name(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["name"] = message.text

await message.reply("Введите пожалуйста Ваш номер телефона (без знака + и пробелов)",
                    reply_markup=cancel_kb())
await ProfileStatesGroup.next()


@dp.message_handler(state=ProfileStatesGroup.phone)
async def get_phone(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["phone"] = message.text

await message.answer("Укажите пожалуйста удобное время для звонка",
                     reply_markup=cancel_kb())
await ProfileStatesGroup.next()


@dp.message_handler(state=ProfileStatesGroup.time)
async def get_time(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["time"] = message.text
await edit_profile(state, user_id=message.from_user.id)
await message.answer('Ваша заявка успешно создана, мы свяжемся с Вами в ближайшее время')
await state.finish()


@dp.callback_query_handler(lambda c: c.data == 'contacts')
async def get_contacts(callback_query: types.CallbackQuery):
await bot.send_message(callback_query.from_user.id, 'Наш телефон: ...\n ВК: ...',
                       reply_markup=get_ikb_start())


@dp.callback_query_handler(lambda c: c.data == 'about')
async def get_info(callback_query: types.CallbackQuery):
await bot.send_message(callback_query.from_user.id, 'Мы занимаемся ....',
                       reply_markup=get_ikb_start())


@dp.callback_query_handler(lambda c: c.data == 'currently')
async def get_currently(callback_query: types.CallbackQuery, state: FSMContext):
async with state.proxy() as data:
    data["currently"] = callback_query.data

await bot.send_message(callback_query.from_user.id, text='Введите пожалуйста Ваше имя и фамилию',
                       reply_markup=cancel_kb() )
await ProfileStatesGroup.next()


@dp.message_handler(lambda message: not message.text.isdigit(), 
state=ProfileStatesGroup.phone)
async def check_cur_phone(message: types.Message):
await message.reply('Вы ввели некорректный номер телефона, попробуйте снова',
                    reply_markup=cancel_kb())


@dp.message_handler(state=ProfileStatesGroup.cur_name)
async def get_currently_name(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["cur_name"] = message.text

await message.answer('Введите пожалуйста Ваш номер (без знака + и пробелов)',
                     reply_markup=cancel_kb())
await ProfileStatesGroup.next()


@dp.message_handler(state=ProfileStatesGroup.cur_phone)
async def get_cur_phone(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["cur_phone"] = message.text

await message.answer("Укажите пожалуйста удобное время для записи на прием",
                     reply_markup=cancel_kb())
await ProfileStatesGroup.next()


@dp.message_handler(state=ProfileStatesGroup.cur_time)
async def get_cur_time(message: types.Message, state: FSMContext):
async with state.proxy() as data:
    data["cur_time"] = message.text
await edit_profile(state, user_id=message.from_user.id)
await message.reply('Ваша заявка на прием была успешно сохранена, мы свяжемся с Вами в ближайшее время',)
await state.finish()

Ответы

▲ 0Принят

Вопрос был решен за счет добавления новых функций для каждого типа записи в БД:)

async def edit_profile_back_call(state, user_id):
async with state.proxy() as data:
    cur.execute("UPDATE profile SET name = '{}', phone = '{}', time = '{}' WHERE user_id == '{}'".format(
        data['name'], data['phone'], data['time'], user_id))
    db.commit() 


async def edit_profile_currently(state, user_id):
async with state.proxy() as data:
    cur.execute("UPDATE profile SET cur_name = '{}', cur_phone = '{}', cur_time = '{}' WHERE user_id == '{}'".format(
        data['cur_name'], data['cur_phone'], data['cur_time'], user_id))
    db.commit()