Как получить данные из базы данных для использования в команде 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 пользователю, когда он введет эту команду.
Для этого используется декоратор <a href="https://discordpy.readthedocs.io/en/stable/interactions/api.html?highlight=autocomplete#discord.app_commands.autocomplete" rel="nofollow">autocomplete</a> <br/> <pre><code class="python">async def fruit_autocomplete(
    interaction: discord.Interaction,
    current: str,
) -&gt; 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}')</code></pre> <br/> <br/> В данном примере функция <b>fruit_autocomplete</b> будет вызываться при наборе каждой буквы. Делаете вместо статичного списка чтение из БД (только убедитесь, что делаете один раз, а не при наборе каждой буквы!) и фильтруете результат на основе текущего ввода, который лежит в <b>current</b> . <br/> <br/> В простейшем виде сравниваете начальные буквы, но можно делать и более интересные вещи, вроде нечеткого поиска, например через расстояние Дамерау-Левенштейна.
Похожие вопросы