網(wǎng)站首頁 編程語言 正文
1. 高級用法
1.1. 錯(cuò)誤處理
執(zhí)行任何操作后,如果發(fā)生任何錯(cuò)誤,GORM將其設(shè)置為*DB
的Error
字段
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil { // 錯(cuò)誤處理... } // 如果有多個(gè)錯(cuò)誤發(fā)生,用`GetErrors`獲取所有的錯(cuò)誤,它返回`[]error` db.First(&user).Limit(10).Find(&users).GetErrors() // 檢查是否返回RecordNotFound錯(cuò)誤 db.Where("name = ?", "hello world").First(&user).RecordNotFound() if db.Model(&user).Related(&credit_card).RecordNotFound() { // 沒有信用卡被發(fā)現(xiàn)處理... }
1.2. 事物
要在事務(wù)中執(zhí)行一組操作,一般流程如下。
// 開始事務(wù) tx := db.Begin() // 在事務(wù)中做一些數(shù)據(jù)庫操作(從這一點(diǎn)使用'tx',而不是'db') tx.Create(...) // ... // 發(fā)生錯(cuò)誤時(shí)回滾事務(wù) tx.Rollback() // 或提交事務(wù) tx.Commit()
1.2.1. 一個(gè)具體的例子
func CreateAnimals(db *gorm.DB) err { tx := db.Begin() // 注意,一旦你在一個(gè)事務(wù)中,使用tx作為數(shù)據(jù)庫句柄 if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { tx.Rollback() return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { tx.Rollback() return err } tx.Commit() return nil }
1.3. SQL構(gòu)建
1.3.1. 執(zhí)行原生SQL
db.Exec("DROP TABLE users;") db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now, []int64{11,22,33}) // Scan type Result struct { Name string Age int } var result Result db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)
1.3.2. sql.Row & sql.Rows
獲取查詢結(jié)果為*sql.Row
或*sql.Rows
row := db.Table("users").Where("name = ?", "jinzhu").Select("name, age").Row() // (*sql.Row) row.Scan(&name, &age) rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error) defer rows.Close() for rows.Next() { ... rows.Scan(&name, &age, &email) ... } // Raw SQL rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows() // (*sql.Rows, error) defer rows.Close() for rows.Next() { ... rows.Scan(&name, &age, &email) ... }
1.3.3. 迭代中使用sql.Rows的Scan
rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error) defer rows.Close() for rows.Next() { var user User db.ScanRows(rows, &user) // do something }
1.4. 通用數(shù)據(jù)庫接口sql.DB
從*gorm.DB
連接獲取通用數(shù)據(jù)庫接口*sql.DB
// 獲取通用數(shù)據(jù)庫對象`*sql.DB`以使用其函數(shù) db.DB() // Ping db.DB().Ping()
1.4.1. 連接池
db.DB().SetMaxIdleConns(10) db.DB().SetMaxOpenConns(100)
1.5. 復(fù)合主鍵
將多個(gè)字段設(shè)置為主鍵以啟用復(fù)合主鍵
type Product struct { ID string `gorm:"primary_key"` LanguageCode string `gorm:"primary_key"` }
1.6. 日志
Gorm有內(nèi)置的日志記錄器支持,默認(rèn)情況下,它會(huì)打印發(fā)生的錯(cuò)誤
// 啟用Logger,顯示詳細(xì)日志 db.LogMode(true) // 禁用日志記錄器,不顯示任何日志 db.LogMode(false) // 調(diào)試單個(gè)操作,顯示此操作的詳細(xì)日志 db.Debug().Where("name = ?", "jinzhu").First(&User{})
1.6.1. 自定義日志
參考GORM的默認(rèn)記錄器如何自定義它
db.SetLogger(gorm.Logger{revel.TRACE}) db.SetLogger(log.New(os.Stdout, "\r\n", 0))
原文鏈接:https://www.cnblogs.com/guyouyin123/p/14115470.html
相關(guān)推薦
- 2022-05-03 在Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn)_python
- 2022-08-19 Python運(yùn)行時(shí)修改業(yè)務(wù)SQL代碼_python
- 2022-04-17 解決SpringBoot攔截器中無法依賴注入bean
- 2023-05-06 C語言順序表的基本結(jié)構(gòu)與實(shí)現(xiàn)思路詳解_C 語言
- 2022-12-10 Android入門之計(jì)時(shí)器Chronometer的使用教程_Android
- 2022-11-06 Nginx如何配置多個(gè)服務(wù)域名解析共用80端口詳解_nginx
- 2023-10-10 批量快捷創(chuàng)建新數(shù)組的幾種方式
- 2022-01-11 npm install 報(bào)錯(cuò) gyp info it worked if it ends with
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支