Просмотр исходного кода

SVI Добавления, исправления

SVI 2 лет назад
Родитель
Сommit
2ca7bd2205
2 измененных файлов с 120 добавлено и 2 удалено
  1. 16 2
      docs/lesson03.md
  2. 104 0
      docs/lesson04.md

+ 16 - 2
docs/lesson03.md

@@ -24,7 +24,7 @@ type Interface2 interface{
 }
 ```
 
-`func1` не различаем фактические типы `ObjType1` и `ObjType2` -- для неё это один тип `Interface1`.
+`func1` не различает фактические типы `ObjType1` и `ObjType2` -- для неё это один тип `Interface1`.
 
 ## Что даёт интерфейс
 
@@ -35,7 +35,7 @@ type Interface2 interface{
 
 ## Контракт поведения
 
-Контракт поведения -- это гарантия того, что объект передаваемый как параметр вызова обладает нужным поведением. Контракт поведения -- эт набор методов и их аргументов с типами для успешной передачи.
+Контракт поведения -- это гарантия того, что объект передаваемый как параметр вызова обладает нужным поведением. Контракт поведения -- это набор методов и их аргументов с типами для успешной передачи.
 
 Разные вызовы требуют разных контрактов (наборов методов), таки образом один и тот же объект может __удовлетворять__ разным интерфейсам, например:
 
@@ -52,6 +52,20 @@ type IWriterReader interface {
     IWriter
     IReader
 }
+
+func write(wr IWriter){
+    _ = wr.Write("test.txt")
+}
+
+func read(rd IReader){
+    _, _ = rd.Read("test.txt")
+}
+
+func rewrite(rw IWriterReader){
+    binData,_=rw.Read("test.txt")
+    binData = append(binData, []byte("hello\n"))
+    _ = rw.Write("test.txt", binData)
+}
 ```
 
 

+ 104 - 0
docs/lesson04.md

@@ -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
+
+