GORM手冊(一)
安裝
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
通用模型
type User struct {
Updated int64 `gorm:"autoUpdateTime:nano"` // 使用時間戳納秒數(shù)填充更新時間
Updated int64 `gorm:"autoUpdateTime:milli"` // 使用時間戳毫秒數(shù)填充更新時間
Created int64 `gorm:"autoCreateTime"` // 使用時間戳秒數(shù)填充創(chuàng)建時間
}
連接數(shù)據(jù)庫
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dbLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
logger.Config{
SlowThreshold: time.Second, // 慢 SQL 閾值
LogLevel: logger.Info, // Log level
Colorful: false, // 禁用彩色打印
},
)
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
SkipDefaultTransaction: true, // 關(guān)閉默認(rèn)事務(wù)
CreateBatchSize: 1000, // 批量插入1000
Logger: dbLogger,
})
}
字段映射
-
表名映射(默認(rèn)是struct名的復(fù)數(shù))
// 方式1唇敞,推薦
db.Table("user").CreateTable(&YourStruct{})
// 方式2
func (User) TableName() string {
return "user"
}
// 方式3,不推薦咒劲,Model引入的字段不好控制
type User struct {
gorm.Model `gorm:"table:user"`
}
-
字段映射
// 數(shù)據(jù)庫對應(yīng)表字段與golang語言中定義的結(jié)構(gòu)體變量不一致時泣洞,需要使用指定映射關(guān)系
type Person struct {
Id int `gorm:"column:id"`
}
創(chuàng)建記錄
- 常用創(chuàng)建
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user) // 通過數(shù)據(jù)的指針來創(chuàng)建
user.ID // 返回插入數(shù)據(jù)的主鍵
result.Error // 返回 error
result.RowsAffected // 返回插入記錄的條數(shù)
- 指定字段插入
db.Select("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")
- 忽略字段插入
db.Omit("Name", "Age", "CreatedAt").Create(&user)
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775")
批量插入
要有效地插入大量記錄祈争,請將一個 slice
傳遞給 Create
方法店枣。 GORM 將生成單獨一條SQL語句來插入所有數(shù)據(jù)旺上,并回填主鍵的值辟狈,鉤子方法也會被調(diào)用肠缔。
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
使用 CreateInBatches
分批創(chuàng)建時,你可以指定每批的數(shù)量上陕,例如:
var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// 數(shù)量為 100
db.CreateInBatches(users, 100)
也可以使用CreateBatchSize
初始化GORM桩砰,所有的創(chuàng)建Create
都會遵循批量插入
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
CreateBatchSize: 1000,
})
users = [5000]User{{Name: "jinzhu", Pets: []Pet{pet1, pet2, pet3}}...}
db.Create(&users)
查詢
// 獲取第一條記錄(主鍵升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 獲取一條記錄,沒有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 獲取最后一條記錄(主鍵降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
result := db.First(&user)
result.RowsAffected // 返回找到的記錄數(shù)
result.Error // returns error or nil
// 檢查 ErrRecordNotFound 錯誤
errors.Is(result.Error, gorm.ErrRecordNotFound)
Where語句
Where("status=? AND version=?", 11, "d12")
Where("id in ?", []int{1,2})
Update語句
Update("status", 11)
Updates語句
Updates(map[string]interface{}{
"status": 12,
"version": "d13",
})