Бот не выводит ранее указанное значение
Недавно начал кодить телеграмм ботов c базой данных на Python, используя библиотеки pytelegrambotAPI и sqlite3, и столкнулся с проблемой. Код не выводит значение, указаное пользователем. Код:
import sqlite3
token =
bot = telebot.TeleBot(token)
db = sqlite3.connect('data.db', check_same_thread=False)
cursor = db.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS tbl(
user_id integer,
status string
)''')
@bot.message_handler(commands=['start'])
def welcome(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("test func")
markup.add(item1)
bot.send_message(message.chat.id, "Привет, {0.first_name}!\nЯ - {1.first_name}!".format(message.from_user, bot.get_me()), reply_markup=markup)
@bot.message_handler(content_types=['text'])
def main(message):
if message.chat.type == 'private':
if message.text == "Назад":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("test func")
markup.add(item1)
bot.send_message(message.chat.id, "Назад".format(message.from_user, bot.get_me()), reply_markup=markup)
elif message.text == "test func":
cursor.execute(f"SELECT `status` FROM `tbl` WHERE `user_id` = '{message.from_user.id}'")
if cursor.fetchone() is None:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("1а")
item2 = types.KeyboardButton("2а")
back = types.KeyboardButton("Назад")
markup.add(item1, item2, back)
bot.send_message(message.chat.id, "test func".format(message.from_user, bot.get_me()), reply_markup=markup)
elif cursor.fetchone() == '1':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
back = types.KeyboardButton("Назад")
markup.add(back)
bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)
elif cursor.fetchone() == "2":
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
back = types.KeyboardButton("Назад")
markup.add(back)
bot.send_message(message.chat.id, "2".format(message.from_user, bot.get_me()), reply_markup=markup)
elif message.text == "1а":
cursor.execute('INSERT INTO tbl VALUES (?, ?)', (message.from_user.id, '1'))
db.commit()
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
back = types.KeyboardButton("Назад")
markup.add(back)
bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)
elif message.text == "2а":
cursor.execute('INSERT INTO tbl VALUES (?, ?)', (message.from_user.id, '2'))
db.commit()
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
back = types.KeyboardButton("Назад")
markup.add(back)
bot.send_message(message.chat.id, "2".format(message.from_user, bot.get_me()), reply_markup=markup)
bot.polling(none_stop=True)
При выполнении test func первый раз код должен записать данные которые введёт юзер, и когда функция будет выполнятся второй раз он должен вывести значение, которое юзер указал в первый раз когда её использовал. Бот не выводит. Заранее благодарю.
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Функция fetchone возвращает кортеж для существующих данных, поэтому ваша проверка, типа cursor.fetchone() == '1' (например, если статус '1', то проверка была бы ('1',) == '1'), всегда будет False
Я бы поменял код на вот так:
elif message.text == "test func":
sql = "SELECT `status` FROM `tbl` WHERE `user_id` = ?"
result = cursor.execute(sql, [message.from_user.id]).fetchone()
status = result[0] if result else None
if status is None:
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
item1 = types.KeyboardButton("1а")
item2 = types.KeyboardButton("2а")
back = types.KeyboardButton("Назад")
markup.add(item1, item2, back)
bot.send_message(message.chat.id, "test func".format(message.from_user, bot.get_me()), reply_markup=markup)
elif status == '1':
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
back = types.KeyboardButton("Назад")
markup.add(back)
bot.send_message(message.chat.id, "1".format(message.from_user, bot.get_me()), reply_markup=markup)
elif status == "2":
...