GORM — отличная библиотека ORM для разработчиков Go. с невероятным списком функций и скоростью, он считается стандартным GO ORM.

Помимо того, что это отличный ORM для разработчиков Go, он создан, чтобы быть удобным для разработчиков и простым для понимания. Gorm построен на основе пакетов database/sql.

обзор и особенности ORM:

  • Подходит для разработчиков
  • Каждая функция поставляется с тестами.
  • Перехватчики/обратные вызовы (до/после создания/сохранения/обновления/удаления/поиска)
  • Нетерпеливая загрузка с Preload, Joins
  • Контекст, режим подготовленного оператора, режим пробного запуска
  • Построитель SQL, Upsert, Блокировка, Оптимизатор/Индекс/Подсказки к комментариям, Именованный аргумент, Подзапрос
  • Транзакции, вложенные транзакции, точка сохранения, откат к сохраненной точке
  • Ассоциации (имеет один, имеет много, принадлежит, многие ко многим, полиморфизм)
  • Построитель SQL
  • Регистратор

Чтобы установить GORM, выполните следующую команду:

go get -u gorm.io/gorm

Настройка базы данных и подключение

GORM официально поддерживает большинство баз данных с простой настройкой.

  1. PostgreSQL
  2. MySQL
  3. SQLite
  4. SQL-сервер

Для начала импортируйте нужный пакет базы данных в свой проект вместе с драйверами базы данных.

Настройка PostgreSQL

По умолчанию GORM использует pgx в качестве драйвера базы данных/SQL postgres, а также позволяет кэшировать подготовленные операторы.

Настройка MySQL

Настройка SQLite

Настройка SQL-сервера

Объявление моделей данных

GORM позволяет использовать обычные структуры в качестве моделей с базовыми типами Go, указателями/псевдонимами или пользовательскими типами, реализующими интерфейсы Scanner и Valuer. GORM позволяет вам определить модели перед созданием таблиц, и таблица будет создана на основе модели, она преобразует имя структуры во множественное число в snake_cases в качестве имени таблицы, snake_case в качестве имени столбца и использует CreatedAt, UpdatedAt для отслеживания времени создания/обновления.

Например:

GORM предпочитает соглашение конфигурации, по умолчанию GORM использует ID в качестве первичного ключа. Первичный ключ может быть как числовым, так и строковым, в зависимости от выбора разработчика.

Хуки и жизненный цикл объекта

Хуки — это функции, которые вызываются до или после создания/запроса/обновления/удаления в базе данных, что позволяет разработчикам определять определенные методы для каждой модели.

Тип методов ловушек должен быть func(*gorm.DB) error

ПРИМЕЧАНИЕ GORM запускает транзакции по умолчанию при выполнении операций сохранения/удаления, поэтому изменения, внесенные в эту транзакцию, не видны до тех пор, пока она не будет зафиксирована. Если вы вернете какую-либо ошибку в своих ловушках, изменение будет отменено.

Автоматическая миграция

AutoMigrate создаст таблицы, отсутствующие внешние ключи, ограничения, столбцы и индексы. Это изменит размер и точность типа существующего столбца. Он НЕ БУДЕТ удалять неиспользуемые столбцы для защиты ваших данных.

db.AutoMigrate(&User{})
db.AutoMigrate(&User{}, &Product{}, &Order{})
// You can add table suffix when creating tables
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

GORM предоставляет интерфейс миграции, который содержит унифицированные API-интерфейсы для каждой базы данных, которые можно использовать для создания миграции, независимой от базы данных, например:

SQLite не поддерживает ALTER COLUMN, DROP COLUMN, GORM создаст новую таблицу как ту, которую вы пытаетесь изменить, скопирует все данные, удалит старую таблицу, переименует новую таблицу

ПРИМЕЧАНИЕ. MySQL не поддерживает переименование столбцов и индексов для некоторых версий, GORM будет выполнять другой SQL в зависимости от используемой вами версии MySQL

CRUD-операции

создать (Создать запись/записи)

Создайте запись и присвойте значение указанным полям.

Чтобы эффективно вставить большое количество записей, передайте срез методу Create. GORM сгенерирует один оператор SQL для вставки всех данных и обратного заполнения значений первичного ключа, также будут вызываться методы-ловушки.

ПРИМЕЧАНИЕ При создании из карты хуки не будут вызываться, ассоциации не будут сохранены, а значения первичного ключа не будут заполнены.

запрос (Получить запись/записи)

GORM предоставляет методы First, Take, Last для извлечения одного объекта из базы данных, добавляет условие LIMIT 1 при запросе к базе данных и возвращает ошибку ErrRecordNotFound, если запись не найдена.

Объекты могут быть получены с использованием первичного ключа с помощью Встроенных условий, если первичный ключ является числом. При работе со строками необходимо проявлять особую осторожность, чтобы избежать SQL-инъекций; подробности в разделе Безопасность.

обновление (обновить запись/записи)

Save сохранит все поля при выполнении обновления SQL

При обновлении одного столбца с помощью Update для него должны быть заданы какие-либо условия, иначе возникнет ошибка ErrMissingWhereClause, подробности см. в разделе Блокировать глобальные обновления. При использовании метода Model и его значения имеют первичное значение, первичный ключ будет использоваться для построить условие, например:

Updates поддерживает обновление с помощью struct или map[string]interface{}, при обновлении с помощью struct по умолчанию будут обновляться только ненулевые поля.

Если вы хотите обновить выбранные поля или игнорировать некоторые поля при обновлении, вы можете использовать Select, Omit

Удалить ( Удаление записи/записей )

При удалении записи удаляемое значение должно иметь первичный ключ, иначе оно вызовет Пакетное удаление, например:

// Email's ID is `10`
db.Delete(&email)
// This will output: DELETE from emails where id = 10;
// Delete with additional conditions
db.Where("name = ?", "jinzhu").Delete(&email)
// This will output: DELETE from emails where id = 10 AND name = "jinzhu";

GORM позволяет удалять объекты, используя первичный(е) ключ(и) со встроенными условиями, он работает с числами, подробности см. во встроенных условиях запроса.

// Delete with primary key
db.Delete(&User{}, 10)
// This will output: DELETE FROM users WHERE id = 10;
db.Delete(&User{}, "10")
// This will output: DELETE FROM users WHERE id = 10;
db.Delete(&users, []int{1,2,3})
// This will output: DELETE FROM users WHERE id IN (1,2,3);

Заключение

Мы рассмотрели только большинство функций, вы можете найти полную документацию по GORM на http://jinzhu.me/gorm/ и действительно получить всестороннее представление о том, насколько GORM крут.

Сообщество GORM по состоянию на середину 2022 года.

Хотите оставаться на связи в Интернете? Средний | Твиттер | Инстаграм | Беханс