Работа с базами данных через ООП: ORM (SQLAlchemy, Django ORM)
Почему ORM — это важно? 🏛️
Работать с базами данных напрямую через SQL-запросы — это как ездить на работу пешком через весь город. Можно, но неэффективно! ORM (Object-Relational Mapping) — это ваш личный "телепорт" между Python-кодом и БД.
👉 Преимущества:
- Пишите на Python, а не на SQL
- Автоматическая защита от инъекций
- Код становится более читаемым и поддерживаемым
- Легко менять СУБД без переписывания запросов
SQLAlchemy: промышленный стандарт 🏭
SQLAlchemy — это как "швейцарский нож" для работы с БД в Python. Работает с PostgreSQL, MySQL, SQLite и другими.
Подключение и декларативная база
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Подключение к SQLite
engine = create_engine('sqlite:///shop.db')
Base = declarative_base()
class Product(Base):
__tablename__ = 'products'
id = Column(Integer, primary_key=True)
name = Column(String)
price = Column(Integer)
# Создаем таблицы
Base.metadata.create_all(engine)
# Создаем сессию
Session = sessionmaker(bind=engine)
session = Session()
CRUD-операции простым языком
# Create (Создание)
new_product = Product(name='Ноутбук', price=99900)
session.add(new_product)
session.commit()
# Read (Чтение)
products = session.query(Product).filter(Product.price > 50000).all()
# Update (Обновление)
product = session.query(Product).get(1)
product.price = 89900
session.commit()
# Delete (Удаление)
session.delete(product)
session.commit()
💡 Совет от Данилы Бежина: Всегда закрывайте сессию через session.close() или используйте менеджер контекста!
Django ORM: магия для веба 🔮
Если вы работаете с Django, ORM уже встроен "из коробки". Работать с ним — одно удовольствие!
Модель — это все
from django.db import models
class Client(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
def __str__(self):
return f"{self.name} ({self.email})"
Крутые фишки Django ORM
# Ленивые запросы (выполняются только при необходимости)
clients = Client.objects.filter(is_active=True)
# Цепочки методов
from django.db.models import Q
result = Client.objects.filter(
Q(name__startswith='А') | Q(email__contains='gmail')
).exclude(is_active=False)
# Аннотации и агрегации
from django.db.models import Count
Client.objects.annotate(order_count=Count('orders'))
⚡ Важно: Django ORM автоматически создает первичные ключи и следит за миграциями!
Когда что выбрать? 🤔
| Критерий | SQLAlchemy | Django ORM |
|---|---|---|
| Проект | Любой Python | Только Django |
| Гибкость | ★★★★★ | ★★★☆☆ |
| Простота | ★★★☆☆ | ★★★★★ |
| Производительность | Высокая | Средняя |
| Документация | Отличная | Отличная |
🔨 SQLAlchemy выбирайте для: - Сложных запросов - Не-Django проектов - Когда нужен полный контроль
🌿 Django ORM идеален для: - Быстрой разработки - Стандартных CRUD-операций - Когда Django уже используется
Продвинутые техники 🚀
SQLAlchemy: отношения между таблицами
class Order(Base):
__tablename__ = 'orders'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="orders")
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
orders = relationship("Order", back_populates="user")
Django: оптимизация запросов
# Проблема N+1 запроса (плохо)
orders = Order.objects.all()
for order in orders:
print(order.user.name) # Новый запрос для каждого заказа
# Решение select_related (хорошо)
orders = Order.objects.select_related('user').all()
🎯 Вывод: ORM — это мощный инструмент, который экономит время и нервы. Освойте его — и вы забудете про ручное написание SQL!