Работа с базами данных через ООП: 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!

Скрыть рекламу навсегда

🌱 Индвидидулаьные занятия

Индивидуальные онлайн-занятия по программированию для детей и подростков

Личный подход, без воды, с фокусом на понимание и реальные проекты.

🚀 Записаться на занятие