From b8c173c5298623f71544960e846e1e71381af909 Mon Sep 17 00:00:00 2001 From: asahi Date: Wed, 15 Jan 2025 12:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBgorm=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Golang/gorm.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Golang/gorm.md diff --git a/Golang/gorm.md b/Golang/gorm.md new file mode 100644 index 0000000..2a1c588 --- /dev/null +++ b/Golang/gorm.md @@ -0,0 +1,79 @@ +- [GORM](#gorm) + - [QuickStart](#quickstart) + - [Declaring Models](#declaring-models) + + +# GORM +## QuickStart +GORM为golang的orm框架,其使用示例如下: +```go +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("failed to connect database") + } + + // Migrate the schema + db.AutoMigrate(&Product{}) + + // Create + db.Create(&Product{Code: "D42", Price: 100}) + + // Read + var product Product + db.First(&product, 1) // find product with integer primary key + db.First(&product, "code = ?", "D42") // find product with code D42 + + // Update - update product's price to 200 + db.Model(&product).Update("Price", 200) + // Update - update multiple fields + db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields + db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"}) + + // Delete - delete product + db.Delete(&product, 1) +} +``` +## Declaring Models +gorm中,Model通过struct来进行定义,struct中的fields可以为如下类型: +- 基础golang类型 +- 指针 +- type alias +- 自定义类型 + - 自定义类型需要实现`database/sql`中的Scanner和Valuer接口 + +如下为一个Model定义的示例: +```go +type User struct { + ID uint // Standard field for the primary key + Name string // A regular string field + Email *string // A pointer to a string, allowing for null values + Age uint8 // An unsigned 8-bit integer + Birthday *time.Time // A pointer to time.Time, can be null + MemberNumber sql.NullString // Uses sql.NullString to handle nullable strings + ActivatedAt sql.NullTime // Uses sql.NullTime for nullable time fields + CreatedAt time.Time // Automatically managed by GORM for creation time + UpdatedAt time.Time // Automatically managed by GORM for update time + ignored string // fields that aren't exported are ignored +} +``` +在上述Model中 +- 基础类型的字段可以直接访问,例如`uint, uint8, string`等 +- 指针类型,例如`*time.Time, *string`等,代表该字段值可为空 +- `sql/database`中的`sql.NullString`和`sql.NullTime`类型,也代表该字段可为空 +- `CreateAt`字段和`UpdatedAt`字段是由Gorm管理的字段,当Record被创建或更新时,该字段的值会自动被注入为当前时间 +- `Non-exported fields`(首字母不是大写)并不会被映射 +