Подключение базы данных для Telegram-магазина (Часть 3)

Подключение базы данных для Telegram-магазина (Часть 3)

Теперь, когда наш 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, чтобы данные загружались автоматически.

Что дальше?

В следующей статье мы добавим корзину товаров, чтобы пользователи могли оформлять заказы!

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.