Как добавить значение в таблицу из разных хендлеров?
Есть несколько хендлеров (различные вопросы пользователю) и нужно сохранить ответы в одну таблицу, даже если ответы в разное время.
Часть кода с вопросами:
@dp.callback_query_handler(text='up_time', state=None)
async def up_tm_cb(call: types.CallbackQuery, state=None):
if call.data == 'up_time':
await bot.send_message(chat_id=call.from_user.id, text='Запиши время подъема: ') #вопрос пользователю
await call.message.delete()
#await create_up_time(user_id=call.from_user.id)
await ProfileStateGroup.up_time.set()
@dp.message_handler(lambda message: not message.text.replace(':', '').isdigit(), state=ProfileStateGroup.up_time)
#@dp.message_handler(re.compile(r'(\d[1-2]:\d{1,2})'), state=ProfileStateGroup.up_time)
async def check_up_time(message: types.Message):
await message.reply('''
Это не число! Попробуй еще раз!
Запиши время подъема:''')
@dp.message_handler(content_types='text', state=ProfileStateGroup.up_time)
async def time_up_st(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['up_time'] = message.text #объявляю переменную для записи данных
await message.reply('Отлично, я запомнил время подъема! Что-то еще?', reply_markup=inkb)
await create_new_up_time(state) #ссылаюсь на функцию бд
await state.finish()
#второй вопрос пользователю
@dp.callback_query_handler(text='down_time', state=None)
async def down_tm_cb(call: CallbackData, state=None):
if call.data == 'down_time':
await bot.send_message(chat_id=call.from_user.id, text="Запиши время отбоя: ") #вопрос
await call.message.delete()
await ProfileStateGroup.down_time.set()
#await create_down_time(user_id=call.from_user.id)
#проверка на число
@dp.message_handler(lambda message: not message.text.replace(':', '').isdigit(), state=ProfileStateGroup.down_time)
async def check_down_time(message: types.Message):
await message.reply('''
Это не число!
Запиши время отбоя: ''')
@dp.message_handler(content_types='text', state=ProfileStateGroup.down_time)
async def time_down_st(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['down_time'] = message.text #объявляю переменную для сохранения ответа
await message.reply ('Отлично, я запомнил время отбоя! Хочешь еще что-то ввести?', reply_markup=inkb)
await create_new_up_time(state) #вызываю функцию бд
#await edit_profile_down_time(state, user_id=message.from_user.id)
await state.finish()
#третий вопрос
@dp.callback_query_handler(text='happy_stat', state = None)
async def callback_query_keyboard(call: CallbackData, state=None):
if call.data == 'happy_stat':
await bot.send_message(chat_id=call.from_user.id, text='Запиши свое настроение: ')
await call.message.delete()
await ProfileStateGroup.happy_stat.set()
#await create_happy_stat(user_id=call.from_user.id)
@dp.message_handler(content_types='text', state=ProfileStateGroup.happy_stat)
async def happy_stat_st(message: types.Message, state: FSMContext):
async with state.proxy() as data:
data['happy_stat'] = message.text
await message.reply('Отлично, я записал твою оценку! Чем-то еще могу помочь?', reply_markup=inkb)
await create_new_up_time(state)
#await edit_profile_happy_stat(state, user_id=message.from_user.id)
#await message.answer(f"Мне известны: Время подъёма: , {data['up_time']}, Время отбоя: , {data['down_time']}, Твое настроение: , {data['happy_stat']}")
await state.finish()
Код с файла базы данных
#создаю файл
db = sq.connect('basatabl.db')
cur = db.cursor()
#создаю таблицу в три поля
cur.execute("""CREATE TABLE IF NOT EXISTS profile(
up_time VARCHAR,
down_time VARCHAR,
happy_stat VARCHAR)
""")
db.commit()
#функция которую потом добавляю в тот файл, должна передавать значение в соответствующее поле
async def create_new_up_time(state):
async with state.proxy() as data:
user = cur.execute("INSERT INTO profile (up_time, down_time, happy_stat) VALUES (?, ?, ?)", (data['up_time'], data['down_time'], data['happy_stat']))
db.commit()
return user
но на данный момент создается строка с айди пользователя и три пустых строки. Как сделать реализацию, чтобы получив ответ, он добавлялся в строку бд.
Например, результат строки: Up_time: 6:00 down_time: none, happy_stat: Good и если пользователь укажет down_time, чтобы он добавился в пустое значение имеющейся строки, а если пользователь укажет новое значение up_time (там уже есть значение 6:00), то он создает новую строку и туда добавляет результат
Ответы (1 шт):
вы должны использовать update/ при первом ответе на сообщение вы должны записывать пользователя в бд, а при следующих ответах просто использовать update
def update_user(новые данные):
db = sq.connect('basatabl.db')
cur = db.cursor()
user = cur.execute("UPDATE profile (необходимый столбец) VALUES (?", (новые данные,))
db.commit()
db.disconnect()