Пытаюсь в телеграм боте сделать добавление данных в БД
У меня есть телеграм бот. Ему присылают геолокацию, бот достаёт ширину и долготу и отдаёт в другой скрипт, второй же скрипт преобразовывает ширину и долготу в город. Потом уже первый скрипт получает название города и присылает его пользователю. Если пользователь подтверждает что город правильный то вызывается другая функция из третьего скрипта. Третий скрипт берёт название города и telegram_id и добавляет название города в БД где telegram_id(в базе) == telegram_id(в функции). НО у меня почему то это не работает.
Вот хендлер:
@bot.message_handler(content_types=['location'])
def location_lat_loc(message):
if message.location:
lat = message.location.latitude
loc = message.location.longitude
city = dadata_city(lat=lat, loc=loc) # Функция определения города по координатам
if not city: # Если город не найден
bot.send_message(
message.chat.id,
text='К сожалению я *не нашёл* рядом с вами *поддерживаемый* город, чтобы попробовать ещё раз, введите команду */gps*',
parse_mode='Markdown',
reply_markup=types.ReplyKeyboardRemove()
)
else:
bot.send_message(
message.chat.id,
text=f'*Определяем город.*',
parse_mode='Markdown',
reply_markup=types.ReplyKeyboardRemove()
)
keyboard = types.InlineKeyboardMarkup()
button_yes_it_my = types.InlineKeyboardButton(text="✅Да, мой", callback_data=f'yes_my_city_{city}')
button_not_my = types.InlineKeyboardButton(text="❌Нет не мой.", callback_data='no_is_not_my_city')
keyboard.add(button_yes_it_my, button_not_my)
bot.send_message(
message.chat.id,
text=f'Это ваш город? {city}',
reply_markup=keyboard
)
@bot.callback_query_handler(func=lambda call: call.data.startswith('yes_my_city'))
def yes_my_city(call):
city = call.data[len('yes_my_city_'):]
bot.send_message(call.message.chat.id, f'*Вы поставили свой город {city}*',
parse_mode='Markdown')
delete_city_value(call.message.from_user.id)
if city_update(call.message.from_user.id, str(city)) == 'Success':
bot.send_message(call.message.chat.id, 'Ваш город успешно обновлен.')
else:
bot.send_message(call.message.chat.id, 'Произошла ошибка при обновлении вашего города.')
if city_search(call.message.from_user.id) is None:
bot.send_message(call.message.chat.id, 'Не подтверждаю.')
print('Города нет.')
@bot.callback_query_handler(func=lambda call: call.data == 'no_is_not_my_city')
def no_is_not_my_city(call):
bot.send_message(call.message.chat.id, 'Пожалуйста, попробуйте еще раз, используя команду /gps.')
Вот функция установки значения в бд:
def city_update(telegram_id, city):
Success = 'Success'
city = str(city)
connection = None
try:
connection = sqlite3.connect('data.db')
cursor = connection.cursor()
delete_city_value(telegram_id)
cursor.execute('UPDATE Telegram SET city = ? WHERE telegram_id = ?', (city, telegram_id))
connection.commit()
print("Апдейт города успешно.")
return Success
except sqlite3.Error as e:
print(f"Ошибка city_update: {e}")
return False
finally:
if connection:
connection.close()
Если что в самом начале при команде /start бот в бд записывает telegram_id если этот человек заходит в первый раз и ставит в поле города 'not_set'. Везде защиты от ошибок. Вот как выглядит cmd после этого.
Бот запущен!
Пользователь с ID 5649807381 существует.
Значение в ячейке city для telegram_id = 7472280268 было удалено.
Значение в ячейке city для telegram_id = 7472280268 было удалено.
Апдейт города успешно.
Город не найден для данного telegram_id.
Города нет.
Библиотека telebot.