💻 Примеры кода блока SQLAlchemy

⚡ Ключевые примеры

# Минимальный рабочий пример
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()
engine = create_engine('sqlite:///:memory:')

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

Base.metadata.create_all(engine)
session = sessionmaker(bind=engine)()

session.add(User(name="Alice"))
session.commit()
print(session.query(User).all())

Пример 1. Создание модели и таблицы

Полный пример от определения модели до создания таблицы в базе:

from sqlalchemy import create_engine, Column, Integer, String, Boolean, Numeric, ForeignKey
from sqlalchemy.orm import declarative_base, sessionmaker, relationship

Base = declarative_base()
engine = create_engine('sqlite:///example.db')

class Category(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    name = Column(String(100), nullable=False)
    description = Column(String(255))
    products = relationship("Product", back_populates="category")

class Product(Base):
    __tablename__ = 'products'
    id = Column(Integer, primary_key=True)
    name = Column(String(100), nullable=False)
    price = Column(Numeric(10, 2))
    in_stock = Column(Boolean, default=True)
    category_id = Column(Integer, ForeignKey('categories.id'))
    category = relationship("Category", back_populates="products")

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

Пример 2. CRUD: Create

# Добавление категорий
categories = [
    Category(name="Электроника", description="Гаджеты и устройства."),
    Category(name="Книги", description="Печатные и электронные книги."),
    Category(name="Одежда", description="Одежда для мужчин и женщин."),
]
session.add_all(categories)
session.commit()

# Добавление продуктов
products = [
    Product(name="Смартфон", price=299.99, in_stock=True, category=categories[0]),
    Product(name="Ноутбук", price=499.99, in_stock=True, category=categories[0]),
    Product(name="Роман", price=15.99, in_stock=True, category=categories[1]),
    Product(name="Джинсы", price=40.50, in_stock=False, category=categories[2]),
    Product(name="Футболка", price=20.00, in_stock=True, category=categories[2]),
]
session.add_all(products)
session.commit()

Пример 3. CRUD: Read с фильтрацией

# Все категории с их продуктами
for category in session.query(Category).all():
    print(f"Категория: {category.name}")
    for p in category.products:
        print(f"  - {p.name}: {p.price} ({'есть' if p.in_stock else 'нет'})")

# Только продукты в наличии дороже 100
expensive_in_stock = session.query(Product).filter(
    Product.in_stock == True,
    Product.price > 100
).all()
for p in expensive_in_stock:
    print(p.name, p.price)

Пример 4. CRUD: Update и Delete

# Update — обновить цену смартфона
product = session.query(Product).filter_by(name="Смартфон").first()
if product:
    product.price = 349.99
    session.commit()

# Delete — удалить продукт
product = session.query(Product).filter_by(name="Футболка").first()
if product:
    session.delete(product)
    session.commit()

Пример 5. Агрегации и группировка

from sqlalchemy import func

# Общее количество продуктов по категориям
result = session.query(
    Category.name,
    func.count(Product.id).label('total')
).join(Product).group_by(Category.name).all()

for row in result:
    print(f"{row.name}: {row.total} продуктов")

# Категории, где больше одного продукта
cats = session.query(
    Category.name
).join(Product).group_by(Category.name).having(
    func.count(Product.id) > 1
).all()
print("Категории с 2+ продуктами:", [c.name for c in cats])

Пример 6. Логические условия и сортировка

from sqlalchemy import and_, or_, desc

# Продукты в наличии ИЛИ дешевле 20
session.query(Product).filter(
    or_(Product.in_stock == True, Product.price < 20)
).all()

# Сортировка по цене убывающей
session.query(Product).order_by(desc(Product.price)).all()

# По двум полям
session.query(Product).order_by(desc(Product.price), Product.name).all()

Пример 7. JOIN

# Inner Join — только продукты с категорией
users_with_addr = session.query(Product).join(Category).all()

# Left Outer Join — все продукты, включая без категории
session.query(Product).outerjoin(Category).all()

# Получить данные из обеих таблиц
session.query(Product.name, Category.name).join(Category).all()

Пример 8. Подзапрос

from sqlalchemy import func

# Средняя цена продуктов
avg_price_sub = session.query(
    func.avg(Product.price).label('avg_price')
).subquery()

# Продукты дороже среднего
expensive = session.query(Product).filter(
    Product.price > avg_price_sub
).all()
for p in expensive:
    print(p.name, p.price)