Как получить данные из базы данных для использования в команде app_commands.Choice?

Как настроить отображение списка из базы данных music.db при вводе символа /a?
  • 11 апреля 2024 г. 12:39
Ответы на вопрос 2
Для получения данных из базы данных для использования в команде app_commands.Choice, вам необходимо сначала подключиться к базе данных, выполнить запрос для извлечения нужных данных, затем преобразовать их в формат, подходящий для использования в команде Choice. 

Пример кода для получения данных из базы данных для использования в команде Choice:

```python
import sqlite3
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from app_commands import Choice

# Подключение к базе данных
conn = sqlite3.connect('music.db')
cursor = conn.cursor()

# Выполнение запроса для получения данных
cursor.execute("SELECT artist_name FROM artists")
data = cursor.fetchall()

# Преобразование данных в список кнопок для ReplyKeyboardMarkup
keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
for row in data:
    keyboard.add(KeyboardButton(row[0]))

# Создание объекта Choice с полученными данными
choice = Choice(keyboard=keyboard)
```

Чтобы настроить отображение списка из базы данных music.db при вводе символа /a, вам нужно создать соответствующую обработку в вашем боте. 

Пример кода для настройки отображения списка из базы данных при вводе символа /a:

```python
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.dispatcher.filters import Text

from loader import dp
from app_commands import music

@dp.message_handler(Command('start'))
async def start(message: types.Message):
    await message.answer("Введите /a для отображения списка музыки")

@dp.message_handler(Text(equals="/a"))
async def show_music_list(message: types.Message):
    # Подключение к базе данных
    conn = sqlite3.connect('music.db')
    cursor = conn.cursor()

    # Выполнение запроса для получения списка музыки
    cursor.execute("SELECT * FROM music")
    data = cursor.fetchall()

    # Формирование строки с данными из базы данных
    music_list = ""
    for row in data:
        music_list += f"Название: {row[0]}, Исполнитель: {row[1]} \n"

    await message.answer(music_list)
```

Этот код обработает команду /a и отобразит список музыки из базы данных music.db пользователю, когда он введет эту команду.
Для этого используется декоратор autocomplete 
async def fruit_autocomplete(
    interaction: discord.Interaction,
    current: str,
) -> List[app_commands.Choice[str]]:
    fruits = ...  # Список данных полученный из БД
    ... # Фильтрация списка 
    return [
        app_commands.Choice(name=fruit, value=fruit)
        for fruit in fruits if current.lower() in fruit.lower()
    ]

@app_commands.command()
@app_commands.autocomplete(fruit=fruit_autocomplete)
async def fruits(interaction: discord.Interaction, fruit: str):
    await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}')


В данном примере функция fruit_autocomplete будет вызываться при наборе каждой буквы. Делаете вместо статичного списка чтение из БД (только убедитесь, что делаете один раз, а не при наборе каждой буквы!) и фильтруете результат на основе текущего ввода, который лежит в current .

В простейшем виде сравниваете начальные буквы, но можно делать и более интересные вещи, вроде нечеткого поиска, например через расстояние Дамерау-Левенштейна.
Похожие вопросы