Golang сравнение различных ORM
В этой статье мы сравним популярные ОРМ для Go, чтобы помочь вам решить, какая из них подходит для вашего проекта.
Но для начала давайте разберемся, что такое ORM и когда вам может понадобиться его использовать.
💡 Что такое ORM?
ORM (Object-Relational Mapper) – это инструмент, который упрощает взаимодействие с базами данных.
При разработке на Go он, по сути, сопоставляет структуры Go с таблицами базы данных, делая работу с реляционными данными более интуитивно понятной.
Например, в нашей базе данных есть такая таблица:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(100),
);
И вы хотите использовать этот SQL-запрос:
-- Fetch all users with the last name "Smith"
SELECT * FROM users WHERE last_name = 'Smith';
Что, используя ORM (GORM в примере ниже), можно написать такой код:
// First we create a Go struct that maps to our users table
type User struct {
ID uint
FirstName string
LastName string
}
// Using GORM, the equivalent query looks like this
var users []User
result := db.Where("last_name = ?", "Smith").Find(&users)
В данном примере db – это подключение к базе данных GORM.
Метод Where добавляет условие к запросу, а Find выполняет запрос, заполняя результатами фрагмент пользователей.
Этот запрос GORM абстрагируется от сырого SQL, предоставляя более идиоматичный способ взаимодействия с базой данных на Go.
Это особенно полезен для более сложных запросов и может значительно улучшить читаемость и сопровождаемость кода.
🙋♀️ Когда использовать ORM в Go
Обычно ORM используется, когда вам нужно ускорить разработку, связанную с базой данных, обеспечить безопасность типов и сделать код более удобным для чтения и сопровождения.
Это особенно подходит для приложений со сложными моделями данных или когда вы предпочитаете не возиться с шаблонами необработанных SQL-запросов.
🙅♂️ Когда следует избегать ORM.
Следует с осторожностью использовать ORM в системах, критичных к производительности, или там, где вам нужен прямой контроль над взаимодействием с базой данных, поскольку ORM могут создавать дополнительные накладные расходы и иногда добавлять неясность в том, что происходит на уровне базы данных.
🏁 Без лишних слов, давайте рассмотрим лучшие ОРМ для Go.
Gorm
GORM – это комплексный инструмент ORM в Go, предлагающий подход, основанный на коде, который позволяет определять схемы баз данных с помощью тегов struct в Go. Он известен своей дружественностью к разработчикам, что делает его подходящим как для новичков, так и для опытных пользователей. GORM поддерживает различные SQL-базы данных, такие как MySQL, PostgreSQL и SQLite. Он спроектирован так, чтобы быть гибким, позволяя разработчикам при необходимости опускаться до необработанного SQL. Однако следует с осторожностью относиться к его производительности.
Плюсы:
Удобство использования: идеально подходит как для начинающих, так и для опытных разработчиков.
Гибкость: Позволяет использовать необработанный SQL для сложных запросов.
Поддержка баз данных: Совместимость с различными SQL-базами данных, такими как MySQL, PostgreSQL, SQLite.
Активное сообщество: Большая база пользователей и поддержка сообщества.
Минусы:
Производительность: Может быть не так эффективна, как некоторые альтернативы для крупномасштабных приложений.
Накладные расходы: Слой абстракции может добавить сложности и накладных расходов.
Попробовать GORM можно с помощью Encore. Это платформа для разработки бэкенда на Go, которая автоматически создает и переносит базы данных PostgreSQL.
Узнайте больше в документации.
Sqlc
sqlc – это не совсем обычный ORM. Он предлагает уникальный подход, генерируя Go-код из SQL-запросов. Это позволяет разработчикам писать SQL, который sqlc затем преобразует в безопасный для типов Go-код, значительно сокращая количество шаблонов. Это гарантирует, что ваши запросы будут синтаксически правильными и безопасными для типов. sqlc идеально подходит для тех, кто предпочитает писать SQL и ищет эффективный способ интегрировать его в Go-приложение.
Плюсы:
Безопасность типов: Генерирует безопасный для типов Go-код из SQL.
SQL-ориентированность: Идеально подходит для тех, кто предпочитает писать необработанный SQL.
Сокращение количества шаблонов: Автоматизирует большую часть рутинного кодирования, необходимого для взаимодействия с базой данных.
Минусы:
Первоначальная настройка: На начальном этапе может потребоваться больше настроек и конфигураций.
Encore разработан для работы с sqlc и является простым способом опробовать его, так как Encore позаботится об автоматической инициализации ваших баз данных.
Посмотрите пример приложения hello-world с использованием Encore и sqlc на GitHub.
Ent
Ent – это довольно новая ORM, которая использует подход code-first, где вы определяете свою схему в коде Go. Ent популярен благодаря своей способности элегантно обрабатывать сложные модели данных и отношения. Он статически типизирован, что помогает отлавливать ошибки во время компиляции. Однако кривая обучения может быть более крутой по сравнению с более простыми ORM, такими как GORM. Он хорошо подходит для приложений, где приоритетом являются сложные модели данных и безопасность типов.
Плюсы:
Безопасность типов: Статическая типизация, уменьшающая количество ошибок во время выполнения.
Сложные модели: Эффективно справляется со сложными моделями данных и отношениями.
Минусы:
Длительное время компиляции: Генерирует много кода, что приводит к увеличению времени компиляции.
Монолитный подход: Может быть сложно интегрировать в архитектуру микросервисов из-за монолитного дизайна.
Кривая обучения: Может потребовать больше времени на освоение по сравнению с более простыми ORM.
Попробуйте ent
Попробуйте ent в простой форме, используя возможности Encore по автоматическому обеспечению и миграции баз данных PostgreSQL.
Узнайте больше в документации.
SQLBoiler
SQLBoiler использует подход, основанный на базе данных, и генерирует код Go на основе схемы вашей базы данных. Это означает, что он создает высокооптимизированный код, адаптированный под конкретную схему базы данных. SQLBoiler отлично подходит для приложений, в которых схема базы данных хорошо определена и меняется нечасто. Однако, как и sqlc, он требует регенерации кода при изменении схемы базы данных. Он хорошо подходит для проектов, где производительность является ключевой задачей, а схема базы данных стабильна.
Плюсы:
Производительность: Генерирует высокооптимизированный код для конкретной схемы базы данных.
Подход, ориентированный на базу данных: Подстраивает код под существующую схему базы данных.
Индивидуальный ORM: Генерируемый код специфичен для вашей базы данных, что позволяет сократить ненужные абстракции.
Минусы:
: Код необходимо регенерировать при каждом изменении схемы.
Сложная конфигурация: Установка и настройка SQLBoiler может быть более сложной, чем некоторых других ORM.
Итог
У каждого ORM есть свои сильные стороны и идеальные сценарии использования. GORM и ent в большей степени ориентированы на код и удобны для пользователя, подходят для широкого круга приложений.
sqlc и SQLBoiler, с другой стороны, более специализированны и отлично подходят для сценариев, в которых предпочтительно прямое взаимодействие с SQL или проектирование с учетом особенностей базы данных.
Выбор во многом зависит от конкретных потребностей и предпочтений вашего проекта.