Как правильно вывести данные из таблицы в тг бота

InFocusLife

Новичок
Пользователь
Янв 7, 2022
5
0
1
Добрый день!

Пишу простого телеграм бота. Столкнулся с проблемой.

Задача: Необходимо вывести значение столбцов name и shedule при условии что текущий день недели равен значению столбца day. Не могу понять проблемы. При ниже приведенном коде, результат вывода - это первый подходящий результат по условию. и то только колонки name, а колонка shedule не выдается. Хотя необходимо выводить все результаты. Использую БД sqlite

Python:
if call.data == '2':

    def send_shedule():
        date = datetime.datetime.now()
        date = date.weekday()
        conn = sqlite3.connect('na.db')
        cursor = conn.cursor()
        result = cursor.execute(f"SELECT name, shedule FROM an WHERE DAY = {date}")
        return result.fetchall()


    answer = send_shedule()

elif call.data == '10':
    answer = 'Открытые собрания не проводятся!'
elif call.data == '11':
    answer = 'Собрания временно не проводятся!'


bot.send_message(call.message.chat.id, answer)

Скриншот 11-04-2025 120215.jpg

При нажатии на последнюю кнопку должен выйти список собраний, который проходит в этот день, одним сообщением
1744371780220.png
 
Последнее редактирование:

InFocusLife

Новичок
Пользователь
Янв 7, 2022
5
0
1
Может кому пригодится.

Python:
            def send_shedule():
                date = datetime.datetime.now()
                date = date.weekday()
                conn = sqlite3.connect('na.db')
                #conn.row_factory = sqlite3.Row
                cursor = conn.cursor()
                s = ''
                with conn:
                    result = cursor.execute(f"SELECT name, shedule FROM an WHERE DAY = {date}").fetchall()
                    for row in result:
                        s = s  + row[0]  + ' → ' + row[1] + '\n\n'
                    bot.send_message(call.message.chat.id, s)
 

PYDEV

Администратор
Команда форума
Администратор
Авг 31, 2023
88
22
8
Отправьте весь код архивом
 

DeepseekUser

Новичок
Пользователь
Апр 17, 2025
12
0
1
Проблема в вашем коде связана с несколькими моментами. Давайте разберём их и предложу исправленный вариант:

Проблемы в текущем коде:​

  1. Вывод только первой записи: fetchall() возвращает список кортежей, но вы пытаетесь вывести его напрямую как строку.
  2. Форматирование вывода: Нужно правильно обработать и отформатировать результаты запроса.
  3. Закрытие соединения: Важно закрывать соединение с БД после использования.

Исправленный код:​

Python:
]if call.data == '2':
    def send_schedule():
        date = datetime.datetime.now().weekday()
        conn = sqlite3.connect('na.db')
        cursor = conn.cursor()
        cursor.execute("SELECT name, schedule FROM an WHERE day = ?", (date,))
        results = cursor.fetchall()
        conn.close()
        
        if not results:
            return "На сегодня собраний не запланировано."
        
        response = "Сегодня проходят следующие собрания:\n\n"
        for row in results:
            response += f"📌 {row[0]}\n🕒 {row[1]}\n\n"
        return response.strip()

    answer = send_schedule()
elif call.data == '10':
    answer = 'Открытые собрания не проводятся!'
elif call.data == '11':
    answer = 'Собрания временно не проводятся!'

bot.send_message(call.message.chat.id, answer)

Ключевые улучшения:​

  1. Использование параметризованных запросов (?) вместо f-строки для безопасности
  2. Правильная обработка результатов:
    • Проверка на пустой результат
    • Форматирование всех найденных записей
  3. Закрытие соединения с БД после использования
  4. Улучшенный вывод с эмодзи и понятным форматированием

Дополнительные рекомендации:​

  1. Если день недели в БД хранится в другом формате (например, строкой "Monday"), нужно преобразовать date соответствующим образом.
  2. Можно добавить обработку ошибок при работе с БД.
  3. Для больших проектов рассмотрите использование контекстного менеджера (with) для работы с соединением.
Пример с обработкой ошибок:
Python:
def send_schedule():
    try:
        date = datetime.datetime.now().weekday()
        with sqlite3.connect('na.db') as conn:
            cursor = conn.cursor()
            cursor.execute("SELECT name, schedule FROM an WHERE day = ?", (date,))
            results = cursor.fetchall()
        
        if not results:
            return "На сегодня собраний не запланировано."
        
        return "\n\n".join([f"📌 {name}\n🕒 {schedule}" for name, schedule in results])
    
    except sqlite3.Error as e:
        return f"Произошла ошибка при получении расписания: {e}"
 

Форум IT Специалистов