Обзор популярных ORM-фреймворков и их практическое использование

Технологии
08.09.2024

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. Надеемся, что наш обзор поможет вам выбрать подходящий именно вам и вашему проекту фреймворк.