Как получить и отобразить список данных из базы данных в Telegram-боте?

Всем привет! Я хочу настроить свой тестовый Telegram-бот, чтобы он отображал запросы непосредственно в самом Telegram, вместо того чтобы выводить данные только в консоль. Как я могу это сделать? Вот соответствующий код: 

```python
import psycopg2
import telebot
from telebot import types
from telebot.types import Message
from googletrans import Translator
from langdetect import detect
from contextlib import closing

TOKEN = ....
bot = telebot.TeleBot(TOKEN)
translator = Translator()
ru_letters = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
en_letters = "abcdefghijklmnopqrstuvwxyz"
DATABASE_URL = ...

def connect_to_db():
    conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    return conn

def insert_data(words, translate):
    conn = connect_to_db()
    cursor = conn.cursor()
    query = "INSERT INTO Dictionary (words, translate) VALUES (%s, %s)"
    cursor.execute(query, (words, translate))
    conn.commit()
    cursor.close()
    conn.close()

def select_data():
    conn = connect_to_db()
    cursor = conn.cursor()
    cursor.execute('select words, Dictionary.translate, description, Terms.translate from Dictionary inner join Terms on Dictionary.id = Terms.words_id')
    conn.commit()
    cursor.close()
    conn.close()

@bot.message_handler(commands=['start'])
def start(message):
    message_user = f"Привет, <b>{message.from_user.first_name.title()}</b>! Я тестовый бот.\n" \
                   f"1. Чем полезен бот\n"
```

Заранее спасибо за помощь!
  • 31 августа 2024 г. 7:04
Ответы на вопрос 2
Привет! Чтобы ваш Telegram-бот отображал данные, полученные из базы данных, вам нужно модифицировать функцию `select_data`. В текущем состоянии она не возвращает значения, которые можно использовать для отправки сообщения в Telegram. Вместо этого она просто выполняет запрос и закрывает соединение.

Вот пример, как можно изменить ваш код так, чтобы данные из базы данных отправлялись пользователю в ответ на команду. Мы модифицируем функцию `select_data`, чтобы она возвращала результаты, и добавим обработку для вывода этих данных в боте.

Ваш обновлённый код может выглядеть так:

```python
import psycopg2
import telebot
from telebot import types
from telebot.types import Message
from googletrans import Translator
from langdetect import detect
from contextlib import closing

TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
bot = telebot.TeleBot(TOKEN)
translator = Translator()
DATABASE_URL = 'YOUR_DATABASE_URL'

def connect_to_db():
    conn = psycopg2.connect(DATABASE_URL, sslmode='require')
    return conn

def insert_data(words, translate):
    conn = connect_to_db()
    cursor = conn.cursor()
    query = "INSERT INTO Dictionary (words, translate) VALUES (%s, %s)"
    cursor.execute(query, (words, translate))
    conn.commit()
    cursor.close()
    conn.close()

def select_data():
    conn = connect_to_db()
    cursor = conn.cursor()
    cursor.execute('SELECT words, Dictionary.translate, description, Terms.translate FROM Dictionary INNER JOIN Terms ON Dictionary.id = Terms.words_id')
    results = cursor.fetchall()  # Получаем все результаты
    cursor.close()
    conn.close()
    return results  # Возвращаем результаты

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, f"Привет, <b>{message.from_user.first_name.title()}</b>! Я тестовый бот.\n"
                                       f"1. Чем полезен бот\n")

@bot.message_handler(commands=['get_data'])
def get_data(message):
    data = select_data()  # Получаем данные из базы
    if data:
        response = ""
        for row in data:
            words, translate, description, term_translate = row
            response += f"Слово: {words}, Перевод: {translate}, Описание: {description}, Перевод термина: {term_translate}\n"
        bot.send_message(message.chat.id, response or "Данные отсутствуют.")
    else:
        bot.send_message(message.chat.id, "Не удалось получить данные.")

# Запуск бота
if __name__ == '__main__':
    bot.polling(none_stop=True)
```

### Что здесь изменено?

1. **Функция `select_data`:** Теперь она возвращает список результатов, полученных из базы данных.

2. **Обработчик команды `/get_data`:** Эта новая функция позволяет пользователю запрашивать данные из базы. Она вызывает `select_data`, формирует строку ответа и отправляет её пользователю.

3. **Форматирование сообщения:** Для каждого результата из базы данных формируется строка, и все они объединяются.

### Замечания

- Не забудьте заменить `YOUR_TELEGRAM_BOT_TOKEN` и `YOUR_DATABASE_URL` на ваши реальные параметры.
- Для корректного отображения в Telegram можно использовать HTML-тэги, например, `<b>` для жирного текста.
- Не забудьте предварительно установить требуемые библиотеки (например, `psycopg2`, `pyTelegramBotAPI`, `googletrans`, и другие), если они у вас еще не установлены. 

Такой код позволит вашему боту взаимодействовать с базой данных и отправлять пользователям запрашиваемую информацию.
Только первый столбец отправляется, потому что в row кортеж. Его нужно соединить в строку 
bot.send_message(message.chat.id, ' '.join(row))
Похожие вопросы