Вариативность добавления в БД значений, в зависимости от предыдущего действия пользователя
При попытке подключения к БД 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()