|
|
@@ -0,0 +1,104 @@
|
|
|
+## GORM
|
|
|
+
|
|
|
+**GORM** -- golang object relation model. Библиотека для работы с реляционными БД.
|
|
|
+
|
|
|
+[gorm.io](https://gorm.io/)
|
|
|
+
|
|
|
+## Что умеет
|
|
|
+
|
|
|
+- построение моделей и автомиграция БД;
|
|
|
+- все виды запросов;
|
|
|
+- атрибуты полей таблиц;
|
|
|
+- перехватичики (хуки);
|
|
|
+- ограничения и индексы;
|
|
|
+- несколько драйверов к разным базам данных;
|
|
|
+- упреждающая загрузка;
|
|
|
+- транзакции и многое другое.
|
|
|
+
|
|
|
+## Поддержка БД
|
|
|
+
|
|
|
+- MySQL;
|
|
|
+- MariaDB;
|
|
|
+- PostgreSQL;
|
|
|
+- SQLite;
|
|
|
+- SQL Server;
|
|
|
+- TiDB;
|
|
|
+- Clickhouse;
|
|
|
+- другие по реализации интерфейса.
|
|
|
+
|
|
|
+## Пример модели
|
|
|
+
|
|
|
+```golang
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "gorm.io/gorm"
|
|
|
+ "gorm.io/driver/sqlite"
|
|
|
+)
|
|
|
+
|
|
|
+type Product struct {
|
|
|
+ gorm.Model
|
|
|
+ Code string
|
|
|
+ Price uint
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
|
|
|
+ if err != nil {
|
|
|
+ panic("при подключении к БД")
|
|
|
+ }
|
|
|
+
|
|
|
+ // Автомиграция схемы
|
|
|
+ db.AutoMigrate(&Product{})
|
|
|
+
|
|
|
+ // Создание записи в таблице
|
|
|
+ db.Create(&Product{Code: "D42", Price: 100})
|
|
|
+
|
|
|
+ // Чтение записи из таблицы
|
|
|
+ var product Product
|
|
|
+ db.First(&product, 1) // Поиск продукта по первичному ключу
|
|
|
+ db.First(&product, "code = ?", "D42") // Поиск продукта по коду D42
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## Модель GORM
|
|
|
+
|
|
|
+```golang
|
|
|
+// Определение gorm.Model
|
|
|
+type Model struct {
|
|
|
+ ID uint `gorm:"primaryKey"`
|
|
|
+ CreatedAt time.Time
|
|
|
+ UpdatedAt time.Time
|
|
|
+ DeletedAt gorm.DeletedAt `gorm:"index"`
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+## Теги полей
|
|
|
+
|
|
|
+Список далеко не полный:
|
|
|
+
|
|
|
+- **column** column db name
|
|
|
+- **type** column data type, prefer to use compatible general type, e.g: `bool, int, uint, float, string, time, bytes`, which works for all databases, and can be used with other tags together, like not null, size, autoIncrement… specified database data type like varbinary(8) also supported, when using specified database data type, it needs to be a full database data type, for example: `MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT`
|
|
|
+- **serializer** specifies serializer for how to serialize and deserialize data into db, e.g: `serializer:json/gob/unixtime`
|
|
|
+- **size** specifies column data size/length, e.g: size:256
|
|
|
+- **primaryKey** specifies column as primary key
|
|
|
+- **unique** specifies column as unique
|
|
|
+- **default** specifies column default value
|
|
|
+- . . .
|
|
|
+
|
|
|
+## Допустимость операций над полем
|
|
|
+
|
|
|
+- **<-** set field’s __write__ permission,
|
|
|
+ - `<-:create `create-only field,
|
|
|
+ - `<-:update` update-only field,
|
|
|
+ - `<-:false `no write permission,
|
|
|
+ - `<-` create and update permission
|
|
|
+- **->** set field’s __read__ permission,
|
|
|
+ - `->:false` no read permission
|
|
|
+- **-** ignore this field,
|
|
|
+ - `-` no read/write permission,
|
|
|
+ - `-:migration` no migrate permission,
|
|
|
+ - `-:all` no read/write/migrate permission
|
|
|
+ - `comment` add comment for field when migration
|
|
|
+
|
|
|
+
|