ORM: работа с базой данных через объекты Python
Строки таблицы как объекты Python — удобно, но ORM всё равно формирует и выполняет обычный SQL.
Раздел 22.22 писал SQL-запросы текстом. ORM (Object-Relational Mapper — объектно-реляционное отображение) — это библиотека, которая позволяет работать со строками таблицы как с обычными объектами Python, а не собирать SQL-текст вручную. У разных ORM разный API — вот один и тот же запрос и одна и та же вставка в двух самых заметных ORM экосистемы Python:
| Действие | SQL напрямую | Django ORM | SQLAlchemy 2.x |
|---|---|---|---|
| Прочитать невыполненные задачи | SELECT id, title FROM tasks WHERE done = 0 | Task.objects.filter(done=False) | select(Task).where(Task.done.is_(False)) |
| Добавить новую задачу | INSERT INTO tasks (title) VALUES (?) | Task.objects.create(title="Купить хлеб") | session.add(Task(title="Купить хлеб")) |
SQLAlchemy (описывает себя как «инструментарий SQL и объектно-реляционный преобразователь для Python») используется вместе с разными фреймворками, включая Flask, и распространяется отдельным пакетом. Встроенный ORM Django поставляется вместе с самим фреймворком и тесно с ним интегрирован — это разные библиотеки с разным API, а не два имени одного и того же инструмента.
Почему в итоговом проекте используется sqlite3
Для проекта этой главы (раздел 22.29) выбран прямой модуль
sqlite3, а не ORM: цель этой главы — понять, что именно
происходит с данными на каждом шаге, а не спрятать это за слоем абстракции ещё до того,
как эта абстракция станет понятна. ORM — полезный и распространённый инструмент для
реальных проектов, но здесь он отвлёк бы от самой идеи главы.