【Go】GORM手冊(cè)(一)

GORM手冊(cè)(一)

安裝

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

通用模型

type User struct {
  Updated   int64 `gorm:"autoUpdateTime:nano"` // 使用時(shí)間戳納秒數(shù)填充更新時(shí)間
  Updated   int64 `gorm:"autoUpdateTime:milli"` // 使用時(shí)間戳毫秒數(shù)填充更新時(shí)間
  Created   int64 `gorm:"autoCreateTime"`      // 使用時(shí)間戳秒數(shù)填充創(chuàng)建時(shí)間
}

連接數(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ù)庫對(duì)應(yīng)表字段與golang語言中定義的結(jié)構(gòu)體變量不一致時(shí),需要使用指定映射關(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")

批量插入

要有效地插入大量記錄,請(qǐng)將一個(gè) slice 傳遞給 Create 方法。 GORM 將生成單獨(dú)一條SQL語句來插入所有數(shù)據(jù),并回填主鍵的值,鉤子方法也會(huì)被調(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í),你可以指定每批的數(shù)量,例如:

var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}

// 數(shù)量為 100
db.CreateInBatches(users, 100)

也可以使用CreateBatchSize初始化GORM,所有的創(chuàng)建Create都會(huì)遵循批量插入

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 錯(cuò)誤
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",
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • orm orm 全稱 object relation mapping 對(duì)象映射關(guān)系,目的是解決面向?qū)ο蠛完P(guān)系數(shù)據(jù)庫...
    JarAlreadyTaken閱讀 26,378評(píng)論 1 11
  • 胖sir :接著,給你一個(gè)餡餅兒 兵長 : 來嘞??!一篇來自O(shè)RM的整理筆記... 1 什么是ORM?為什么要?O...
    阿兵云原生閱讀 301評(píng)論 0 1
  • gorm的使用 gorm的安裝 打開go運(yùn)行的文件夾下的終端,創(chuàng)建main.go文件 執(zhí)行下面的指令初始化mod ...
    Lyi_Zri閱讀 788評(píng)論 0 0
  • 今天是公元2021年3月30日,坊間流傳PHP的git服務(wù)器被黑客攻入,因惡意代碼服務(wù)器將關(guān)停,PHP還是世界上最...
    王中陽閱讀 759評(píng)論 0 1
  • Gorm 是一款 ORM 框架,當(dāng)我們想把一個(gè)對(duì)象/struct 持久化的時(shí)候,我們可以直接操作對(duì)象/struct...
    CocoAdapter閱讀 9,741評(píng)論 0 0

友情鏈接更多精彩內(nèi)容