💻 Примеры кода блока 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)