📝 Python

Что такое ORM

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
123
🌿
Уровень
Средний
🐦 💼 ✈️

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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Event loop в Python: как asyncio делает «параллел…

Event loop — сердце asyncio. Он не запускает код параллельно в нескольких потоках. Он переключается...

📅 30.06.2026 👁️ 122
📝

pytest-django: тестирование Django

Охватываемые темы: Установка, @pytest.mark.djangodb, Фикстуры, Тестирование views.

📅 30.06.2026 👁️ 130
📝

pip: менеджер пакетов Python

Охватываемые темы: Установка пакетов, Обновление и удаление, requirements.txt, Виртуальное окружение.

📅 30.06.2026 👁️ 117

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!