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 или проектирование с учетом особенностей базы данных.
Выбор во многом зависит от конкретных потребностей и предпочтений вашего проекта.

+1
0
+1
0
+1
0
+1
1
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *