GORM — отличная библиотека ORM для разработчиков Go. с невероятным списком функций и скоростью, он считается стандартным GO ORM.
Помимо того, что это отличный ORM для разработчиков Go, он создан, чтобы быть удобным для разработчиков и простым для понимания. Gorm построен на основе пакетов database/sql.
обзор и особенности ORM:
- Подходит для разработчиков
- Каждая функция поставляется с тестами.
- Перехватчики/обратные вызовы (до/после создания/сохранения/обновления/удаления/поиска)
- Нетерпеливая загрузка с
Preload
,Joins
- Контекст, режим подготовленного оператора, режим пробного запуска
- Построитель SQL, Upsert, Блокировка, Оптимизатор/Индекс/Подсказки к комментариям, Именованный аргумент, Подзапрос
- Транзакции, вложенные транзакции, точка сохранения, откат к сохраненной точке
- Ассоциации (имеет один, имеет много, принадлежит, многие ко многим, полиморфизм)
- Построитель SQL
- Регистратор
Чтобы установить GORM, выполните следующую команду:
go get -u gorm.io/gorm
Настройка базы данных и подключение
GORM официально поддерживает большинство баз данных с простой настройкой.
- PostgreSQL
- MySQL
- SQLite
- 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 года.
Хотите оставаться на связи в Интернете? Средний | Твиттер | Инстаграм | Беханс