ORM-фреймворки, или объектно-реляционные мапперы, помогают не только ускорить разработку проектов, использующих базы данных (БД) как способ хранения информации. Они также позволяют организовать и структурировать код, скрыть детали реализации и автоматически генерировать сложные SQL-запросы. Все это делает код более управляемым, а ошибок в нем становится меньше.
В этой статье поговорим о том, как ORM-фреймворки помогают строить приложения, оценим преимущества и недостатки, а также расскажем об ограничениях в использовании технологии.
Мы надеемся, что знакомство с этим инструментом откроет для вас новые возможности, а также поможет сориентироваться при выборе подходящей библиотеки для вашего проекта.
Что такое ORM-фреймворки
Object-Relational Mapping (ORM) — это технология, которая позволяет разработчикам взаимодействовать с базами данных. Для этого используют объектно-ориентированный подход со всеми связанными с ним свойствами:
- инкапсуляция (сокрытие деталей);
- наследование (переиспользование кода в связанных сущностях);
- полиморфизм (вариативность поведения объектов с одним интерфейсом).
В сущности, ORM-фреймворки адаптируют концепцию реляционных баз данных к принципам объектно-ориентированных языков.
Помимо этого, они позволяют не погружаться в детали и сосредоточиться на логике приложения, а не на взаимодействии с БД. А еще ORM-фреймворки скрывают из кода построение и прямые вызовы SQL-запросов. Это упрощает разработку и снижает требования к квалификации программиста без необходимости жертвовать качеством кода и стабильностью системы. И, наконец, в ORM-фреймворках обычно используют лучшие практики работы с БД, которые помогают программе работать быстрее за счет техники «ленивой» загрузки, кэширования и других незаметных, но полезных особенностей.
Популярные ORM-фреймворки для различных языков программирования
Обычно фреймворки создают для конкретной базы данных или их семейства и для определенного языка. Но некоторые из реализаций ORM-адаптеров оказываются настолько удачными, что вдохновляют на разработку схожих фреймворков для других языков. Поэтому мы оттолкнемся от самых «горячих» языков разработки и для каждого из них выберем наиболее популярный фреймворк. Опираться будем на данные сервиса для разработчиков GitHub.
Python: SQLAlchemy — примерно 9 100 звезд
Предоставляет полную функциональность для работы с базами данных, в том числе поддержку транзакций, ленивую загрузку, а также гибкие способы построения запросов. SQLAlchemy позволяет работать как с декларативным стилем, так и с использованием низкоуровневого API для максимального контроля над SQL-запросами. Особенно хорошо SQLAlchemy сочетается с Flask и Django при построении веб-приложений, которые полагаются на управление сложными схемами баз данных.
Java: Hibernate — 6 500 звезд
Hibernate отлично справляется с задачей сериализации/десериализации объектов в БД и обратно. Поддерживает кэширование, ленивую загрузку и предоставляет эффективные инструменты для работы с запросами и транзакциями. Простой пример:
Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Book book = new Book(); book.setTitle("The Catcher in the Rye"); book.setAuthor("J.D. Salinger"); session.save(book); session.getTransaction().commit(); session.close();
C#: Entity Framework —13100 звезд
Entity Framework — основной ORM-фреймворк для платформы .NET. Позволяет работать с базами данных с использованием объектов .NET, предоставляет возможности для автоматического создания и миграции схем БД, а также выполнения сложных LINQ-запросов. У фреймворка большое комьюнити, поэтому для него уже написали провайдеры ко всем популярным и не очень SQL-базам данных, как к полноценным, так и к in-memory. Этот фреймворк отлично работает в составе экосистемы средств разработки .NET.
PHP: Doctrine — 9 900 звезд
Doctrine поддерживает как объектно-ориентированный, так и процедурный стиль работы. В обоих вариантах доступна возможность создавать сложные запросы и управлять схемами баз данных.
Пример с ООП-стилем:
java$book = $entityManager->getRepository(Book::class)->find(1);
И такой же в процедурном:
$book = $entityManager->createQuery('SELECT b FROM Book b WHERE b.id = 1')->getSingleResult();
Первый вариант более простой в разработке и поддержании, зато второй дает программисту 100% контроля за происходящим.
Go: GORM — 35 900 звезд
Этот фреймворк создали для языка Go. По числу звезд видно, что он завоевал настоящую любовь инженеров. И хотя Go не объектно-ориентированный язык в строгом смысле этой концепции, его ORM-фреймворк оказался очень популярным.
И на то есть причины: сообщество разработчиков приняло строгие правила выкладки новой функциональности: только с тестами. Продукт уже сейчас предоставляет все возможные варианты работы с БД. Есть и большой набор плагинов для подключения к разным базам данных, и гранулярное управление транзакциями, в том числе вложенными, и автомиграция, и работа в режиме dry run (симуляция без фактических изменений), и даже возможность отбрасывать статистику работы с БД в Prometheus.
Как выбрать ORM
Как видите, фреймворков много. В своем обзоре мы не покрыли и малой доли. Как же их выбирать? Ориентируйтесь на следующие критерии:
- Совместимость с базой данных. Для маленьких проектов лучше брать что-то готовое и не тратить время на написание плагина к понравившемуся вам фреймворку.
- Производительность. Работа ORM — это накладные расходы на вычислительные ресурсы. Если ваше приложение должно обеспечивать максимальную производительность, то стоит выдвинуть конкретные цифры и шорт-лист кандидатов протестировать на нагрузке, имитирующей реальную. Результаты скажут сами за себя.
- Сообщество и поддержка. Чем больше звезд, больше maintainer’ов, тем лучше. Звезды — хороший индикатор «живости» и качества фреймворка.
- Легкость использования и обучения. Тут все просто: для малых проектов берем попроще, а для больших сразу же прикидываем усилия на конфигурирование и легкость управления настройками.
- Функциональность. Необходимо хотя бы примерно представлять, что вы хотите от ORM. Например, одни фреймворки проще в использовании, но не позволяют филигранно работать с транзакциями. Важно ли это для вашего проекта? Общее правило: чем он больше, тем выше вероятность того, что вам потребуется максимум возможностей работы с БД, в том числе сбор статистики и логирование. Здесь же стоит задуматься о том, нужно ли вам прямое исполнение SQL-запросов.
- Поддержка исполнения в многопоточной среде. Это важно, потому что взятие на себя потоковой безопасности может дать прирост производительности, но добавит трудоемкости. И наоборот.
Еще один критерий — совместимость с Code Style Guide и другими фреймворками. Этот пункт почему-то часто упускают из виду, но стыковка идеологически разных фреймворков обычно дает непредсказуемый результат. Простой пример: в C++ очень плохо сочетаются между собой Qt и STL. Это совершенно разные по стилю и способу эффективного использования библиотеки, хотя и написаны на одном и том же языке.
Заключение
Применение ORM-фреймворка для работы с БД существенно экономит силы на разработку приложений. И в подавляющем большинстве случаев выгоды от более высокого качества кода и большей скорости разработки многократно перевешивают накладные расходы на интеграцию и поддержание ORM. Надеемся, что наш обзор поможет вам выбрать подходящий именно вам и вашему проекту фреймворк.
