函式庫 - GORM

[函式庫] GORM

GORM 是 Golang 中使用 ORM 的方式操作資料庫的其中一種套件

基本了解與安裝

ORM

  • ORM 即 Object-Relation Mapping 的簡寫,中文稱作 對象關係映射

  • 簡單來說,是一種將資料庫的內容映射成物件的資料抽象化技術,讓開發人員可以用操作物件的方式對資料庫進行操作

  • 優點 :

    • 不用撰寫冗長的 SQL 語法,使程式碼簡潔易讀
    • 資料庫結構改變時,減少了相對程式碼的修改
  • 缺點 :

    • 要處理複雜的查詢時,ORM 仍然力不從心,語法會變得複雜
    • 比起使用 SQL 語法查詢,ORM 的查詢非常消耗記憶體

安裝

1
go get -u github.com/jinzhu/gorm
  • 終端機下指令直接安裝
1
2
3
4
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
  • 匯入時,還需匯入相對應的資料庫驅動,各資料庫驅動如下 :

    • 使用 _ 匯入當中的 init()
1
2
3
4
import _ "github.com/jinzhu/gorm/dialects/mysql"
import _ "github.com/jinzhu/gorm/dialects/postgres"
import _ "github.com/jinzhu/gorm/dialects/sqlite"
import _ "github.com/jinzhu/gorm/dialects/mssql"

函式介紹

資料庫

連接與關閉資料庫

1
2
3
4
func main() {
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
defer db.Close()
}

遷移 : 作用主要是刷新資料庫裡的 Table,使其保持最新

1
db.AutoMigrate(&User{})

假設第一次寫入資料庫為

1
2
3
4
5
type User struct {
gorm.Model
Name string
Age string
}
  • 新增字段 :
1
2
3
4
5
6
type User struct {
gorm.Model
Name string
Age string
Phone string
}

呼叫 AutoMigrate() 後,資料庫會將以前的資料新增 Phone,內容為 NULL

  • 刪除字段 :
1
2
3
type User struct {
gorm.Model
Name string

呼叫 AutoMigrate() 後,以前的資料保持不變,而新增的資料只有 Name,其他 AgePhone 為 NULL

對 Table 操作

  • 檢查 Table 是否存在
1
2
3
4
5
//檢查模型
db.HasTable(&User{})

//檢查 Table
db.HasTable("users")
  • 創建 Table
1
db.CreateTable(&User{})
  • 刪除 Table
1
2
3
4
5
6
7
8
//刪除模型
db.DropTable(&User{})

//刪除 Table
db.DropTable("users")

//刪除模型、Table
db.DropTableIfExists(&User{}, "products")

定義模型

簡單的基礎模型

1
2
3
4
5
type CreditCard struct {
gorm.Model
UserID uint
Number string
}

gorm.Model 包含 IDCreatedAtUpdatedAtDeletedAt

對模型設置 Table 名

1
2
3
func (CreditCard) TableName() string {
return "CreditCard"
}

若無設置,預設的 Table 名為複數形式,例如 : creditcards

CRUD 增刪改查

新增

1
2
3
4
5
6
7
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}

//查詢主鍵是否存在,否返回 true
db.NewRecord(user)

//新增 user 資料
db.Create(&user)

刪除

1
2
3
4
5
//刪除存在的資料
db.Delete(&email)

//條件刪除
db.Where("email LIKE ?", "%jinzhu%").Delete(Email{})

更新

  • 更新所有字段

    • 即使字段沒被修改也會更新
1
2
3
4
5
6
db.First(&user)

user.Name = "jinzhu 2"
user.Age = 100

db.Save(&user)
  • 只更新修改的字段
1
2
3
4
5
6
//更新單個屬性
db.Model(&user).Update("name", "hello")

//更新多個屬性
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
db.Model(&user).Updates(User{Name: "hello", Age: 18})

查詢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//獲取第一條資料,按主鍵排序
db.First(&user)

//獲取第一條資料,不指定排序
db.Take(&user)

//獲取最後一條資料,按主鍵排序
db.Last(&user)

//獲取所有資料
db.Find(&users)

//匹配主鍵來獲取資料,例如 : id = 10
db.First(&user, 10)

//獲取第一條匹配的資料
db.Where("name = ?", "jinzhu").First(&user)

關於更多 GORM 的細節可以參考文檔 : GORM 中文文檔

tags: 函式庫 Golang GORM
Author: Kenny Li
Link: https://kennyliblog.nctu.me/2020/09/20/GORM/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.