【Go】GORM手冊(一)

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",
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末释簿,一起剝皮案震驚了整個濱河市亚隅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庶溶,老刑警劉巖煮纵,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懂鸵,死亡現(xiàn)場離奇詭異,居然都是意外死亡行疏,警方通過查閱死者的電腦和手機(jī)匆光,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酿联,“玉大人终息,你說我怎么就攤上這事≌耆茫” “怎么了周崭?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喳张。 經(jīng)常有香客問我续镇,道長,這世上最難降的妖魔是什么销部? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任摸航,我火速辦了婚禮,結(jié)果婚禮上舅桩,老公的妹妹穿的比我還像新娘酱虎。我一直安慰自己,他們只是感情好江咳,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布逢净。 她就那樣靜靜地躺著,像睡著了一般歼指。 火紅的嫁衣襯著肌膚如雪爹土。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天踩身,我揣著相機(jī)與錄音胀茵,去河邊找鬼。 笑死挟阻,一個胖子當(dāng)著我的面吹牛琼娘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播附鸽,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼脱拼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坷备?” 一聲冷哼從身側(cè)響起熄浓,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎省撑,沒想到半個月后赌蔑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俯在,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年娃惯,在試婚紗的時候發(fā)現(xiàn)自己被綠了跷乐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趾浅,死狀恐怖愕提,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情皿哨,我是刑警寧澤揪荣,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站往史,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏佛舱。R本人自食惡果不足惜椎例,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望请祖。 院中可真熱鬧订歪,春花似錦、人聲如沸肆捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慎陵。三九已至眼虱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間席纽,已是汗流浹背捏悬。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留润梯,地道東北人过牙。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像纺铭,于是被迫代替她去往敵國和親寇钉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

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