Как создавать кнопки в aiogram с использованием данных из базы данных SQLite3?

Как настроить бота так, чтобы при вводе команды /start пользователю отправлялся список кнопок с тремя городами, а при выборе одного из них отображались товары? У меня есть админ панель для добавления товаров и сохранение данных в базе данных. Я смог добавить кнопки, но они сразу отправляются после добавления, вместо того, чтобы появляться в начальных подкнопках. Можете помочь разобраться?
  • 4 января 2024 г. 18:18
Ответы на вопрос 1
В вашем случае, для создания кнопок в aiogram, использующих данные из базы данных SQLite, вам необходимо создать функцию, которая будет извлекать данные из базы данных и на их основе формировать клавиатуру. Вот шаги, которые помогут вам настроить бота для выполнения описанных задач:

1. **Извлечение данных из SQLite**: Создайте функцию, которая подключается к вашей базе данных SQLite, выполняет запрос для получения списка городов и возвращает результат.

2. **Создание клавиатуры**: Используя полученные данные, создайте клавиатуру с кнопками для каждого города.

3. **Обработка команды `/start`**: Настройте обработчик команды `/start` для отправки клавиатуры пользователю.

4. **Выбор города и отображение товаров**: Настройте callback query handler, чтобы при выборе пользователем одного из городов извлекать товары для этого города и отображать их.

Вот пример кода, иллюстрирующий эти шаги:

```python
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
import sqlite3

API_TOKEN = 'your_bot_token'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# Функция для извлечения городов из базы данных
def get_cities_from_db():
    conn = sqlite3.connect('your_database.db')
    cursor = conn.cursor()
    cursor.execute("SELECT city_name FROM cities")
    cities = cursor.fetchall()
    conn.close()
    return cities

# Функция для создания клавиатуры с городами
def cities_keyboard():
    keyboard = InlineKeyboardMarkup(row_width=3)
    cities = get_cities_from_db()
    for city in cities:
        city_name = city[0]
        keyboard.insert(InlineKeyboardButton(city_name, callback_data=f"city_{city_name}"))
    return keyboard

# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    keyboard = cities_keyboard()
    await message.answer("Выберите город:", reply_markup=keyboard)

# Callback query handler для обработки выбора города
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('city_'))
async def process_city_callback(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    city_name = callback_query.data.split('_')[1]
    # Тут нужно добавить логику для извлечения товаров для выбранного города
    # Например:
    # products = get_products_for_city(city_name)
    # messages = "\n".join([f"{product['name']}: {product['price']}" for product in products])
    # await bot.send_message(callback_query.from_user.id, messages)
    # Не забывайте добавить реализацию get_products_for_city()

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

Этот код является простым примером и может потребовать адаптации в соответствии с вашими конкретными нуждами и структурой базы данных. Замените `'your_bot_token'` реальным токеном вашего бота и `'your_database.db'` на путь к вашей базе данных SQLite.

Обратите внимание, что при построении клавиатуры мы используем InlineKeyboardButton, и каждая кнопка имеет `callback_data`, которая будет использоваться для идентификации выбранного города в callback query handler. Вам потребуется реализовать функцию `get_products_for_city`, которая будет возвращать список товаров в выбранном городе.
Похожие вопросы