ORM (Object-Relational Mapping) — технология, позволяющая работать с базой данных через объекты Python вместо SQL.
Без ORM (сырой SQL)
import sqlite3
conn = sqlite3.connect('db.sqlite3')
cursor = conn.cursor()
cursor.execute("INSERT INTO tasks (title, status) VALUES (?, ?)", ('Задача', 'todo'))
cursor.execute("SELECT * FROM tasks WHERE status = ?", ('todo',))
rows = cursor.fetchall()
С ORM (Django ORM)
from tasks.models import Task
# Создание
task = Task.objects.create(title='Задача', status='todo')
# Чтение
tasks = Task.objects.filter(status='todo')
# Обновление
task.status = 'done'
task.save()
# Удаление
task.delete()
Преимущества ORM
- Безопасность — защита от SQL-инъекций
- Читаемость — Python код вместо SQL строк
- Переносимость — один код для SQLite, PostgreSQL, MySQL
- Миграции — автоматическое обновление схемы БД
Как ORM генерирует SQL
# Python
Task.objects.filter(status='todo', priority__gte=2)
# Генерирует SQL:
# SELECT * FROM tasks WHERE status = 'todo' AND priority >= 2
Можно посмотреть SQL:
qs = Task.objects.filter(status='todo')
print(qs.query)
# SELECT "tasks_task"."id", ... FROM "tasks_task" WHERE "tasks_task"."status" = 'todo'
Популярные ORM в Python
| ORM | Используется с |
|---|---|
| Django ORM | Django |
| SQLAlchemy | Flask, FastAPI, standalone |
| SQLModel | FastAPI (над SQLAlchemy) |
| Peewee | lightweight проекты |
| Tortoise ORM | async Python |
Когда ORM недостаточно
Для сложных аналитических запросов иногда эффективнее использовать raw SQL:
from django.db import connection
with connection.cursor() as cursor:
cursor.execute("SELECT date_trunc('month', created_at), COUNT(*) FROM tasks GROUP BY 1")
rows = cursor.fetchall()
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!