Теперь, когда наш Telegram-бот поддерживает команды и кнопки, нам нужно добавить базу данных для хранения товаров и заказов. В этой статье мы разберем:
✅ Как использовать SQLite3 для хранения данных.
✅ Как создать таблицы для товаров и заказов.
✅ Как подключить базу к боту.
Выбор базы данных
Мы будем использовать SQLite – легковесную реляционную базу данных, которая отлично подходит для Telegram-ботов:
✅ Не требует отдельного сервера, данные хранятся в файле.
✅ Простая настройка – не требует сложных конфигураций.
✅ Идеально для небольшого магазина, а при необходимости можно перейти на PostgreSQL или MySQL.
Установка и подключение SQLite
Python поддерживает SQLite из коробки, поэтому установка не нужна.
Создадим файл database.py
, который будет управлять подключением и операциями с БД.
Создаем database.py
и подключаем SQLite
import sqlite3
# Подключаемся к базе данных (если файла нет, он создастся автоматически)
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
# Создаем таблицу для товаров
cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price INTEGER NOT NULL
)
""")
# Создаем таблицу для заказов
cursor.execute("""
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY (product_id) REFERENCES products (id)
)
""")
# Сохраняем изменения и закрываем соединение
conn.commit()
conn.close()
✅ Что делает этот код?
- Подключается к SQLite и создает файл
shop.db
. - Создает таблицу
products
для хранения товаров (название и цена). - Создает таблицу
orders
для хранения заказов пользователей.
Функции для работы с товарами
Теперь добавим функции для добавления и получения товаров.
Обновляем database.py
добавив функции:
def add_product(name, price):
"""Добавляет товар в базу данных"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO products (name, price) VALUES (?, ?)", (name, price))
conn.commit()
conn.close()
def get_products():
"""Получает список всех товаров"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM products")
products = cursor.fetchall()
conn.close()
return products
✅ Что добавлено?
- Функция
add_product(name, price)
– добавляет товар в базу. - Функция
get_products()
– возвращает список товаров.
Вывод товаров в Telegram-боте
Теперь обновим handlers.py
, чтобы бот получал товары из базы.
Обновленный handlers.py
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery
from keyboards import main_menu, catalog_keyboard
from database import get_products # Импортируем функцию получения товаров
# Создаем Router для обработки команд
router = Router()
# Обработчик команды /start
@router.message(F.text == "/start")
async def start_command(message: Message):
await message.answer(
"Добро пожаловать в магазин! Выберите действие:",
reply_markup=main_menu
)
# Обработчик кнопки "Каталог"
@router.message(F.text == "🛍 Каталог")
async def catalog_command(message: Message):
await message.answer(
"Вот наш каталог. Нажмите кнопку ниже, чтобы просмотреть товары:",
reply_markup=catalog_keyboard
)
# Обработчик inline-кнопки "Смотреть товары"
@router.callback_query()
async def handle_callback(callback: CallbackQuery):
if callback.data == "view_products":
products = get_products() # Получаем список товаров из базы
product_list = "\n".join([f"{p[0]}. {p[1]} - {p[2]}₽" for p in products])
await callback.message.answer(f"Список товаров:\n{product_list}")
await callback.answer()
✅ Что изменилось?
- Теперь товары берутся из базы данных с помощью
get_products()
. - Товары динамически формируются в список, а не захардкожены.
Подключаем database.py
к bot.py
Теперь обновим bot.py
, чтобы база данных создавалась при запуске бота.
Обновленный bot.py
import asyncio
import os
from aiogram import Bot, Dispatcher
from dotenv import load_dotenv
from handlers import router
import database # Импортируем файл базы данных
# Загружаем токен
load_dotenv()
BOT_TOKEN = os.getenv("BOT_TOKEN")
if not BOT_TOKEN:
raise ValueError("Ошибка: BOT_TOKEN не найден. Проверьте файл .env!")
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
# Подключаем обработчики команд
dp.include_router(router)
async def main():
print("Бот запущен...")
database # Это создаст БД, если она еще не существует
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
✅ Теперь база данных создается автоматически при запуске бота. Запусти bot.py и бот автоматически создаст таблицы.
Добавление товаров
Чтобы добавить несколько тестовых товары, можно запустить Python-скрипт вручную.
✅ Открой терминал и запусти Python:
Далее в интерактивном режиме выполни команды:
from database import add_product
add_product("📦 Товар A", 100)
add_product("📦 Товар B", 200)
add_product("📦 Товар C", 300)
print("Товары добавлены!")
После этого товары появятся в базе.
Проверка списка товаров
Чтобы убедиться, что товары записаны, в терминале введи:
from database import get_products
print(get_products())
Ты увидишь список товаров в виде:
Заключение
Теперь наш бот поддерживает базу данных и хранит товары! 🎉
✅ Создали database.py
для управления SQLite.
✅ Добавили товары в БД и вывели их в боте.
✅ Подключили базу к bot.py
, чтобы данные загружались автоматически.
Что дальше?
В следующей статье мы добавим корзину товаров, чтобы пользователи могли оформлять заказы!
Пока нет комментариев. Будьте первым!