go集成gorm數(shù)據(jù)庫的操作代碼
一、什么是gorm
GORM 是一個用于 Go 語言的 ORM(對象關系映射)庫,它提供了一種簡單而強大的方式來與數(shù)據(jù)庫進行交互。GORM 支持多種數(shù)據(jù)庫,包括 MySQL、PostgreSQL、SQLite、SQL Server 等,并且提供了豐富的功能,如自動遷移、預加載、事務管理等。
二、特性
- 全功能 ORM
- 關聯(lián) (Has One,Has Many,Belongs To,Many To Many,多態(tài),單表繼承)
- Create,Save,Update,Delete,F(xiàn)ind 中鉤子方法
- 支持
Preload、Joins的預加載 - 事務,嵌套事務,Save Point,Rollback To Saved Point
- Context、預編譯模式、DryRun 模式
- 批量插入,F(xiàn)indInBatches,F(xiàn)ind/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUD
- SQL 構建器,Upsert,數(shù)據(jù)庫鎖,Optimizer/Index/Comment Hint,命名參數(shù),子查詢
- 復合主鍵,索引,約束
- Auto Migration
- 自定義 Logger
- 靈活的可擴展插件 API:Database Resolver(多數(shù)據(jù)庫,讀寫分離)、Prometheus…
- 每個特性都經(jīng)過了測試的重重考驗
- 開發(fā)者友好
三、安裝
go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
四、集成
func InitMySql() *gorm.DB {
// 數(shù)據(jù)源設置
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: viper.GetString("db.mysql.dsn"),
}),
&gorm.Config{NamingStrategy: schema.NamingStrategy{
TablePrefix: "t_",
SingularTable: true,
},
Logger: logger.Default.LogMode(logger.Info),
DisableForeignKeyConstraintWhenMigrating: true,
},
)
if err != nil {
panic(err)
}
sqlDb, _ := db.DB()
sqlDb.SetMaxOpenConns(viper.GetInt("db.mysql.maxOpenConns"))
sqlDb.SetMaxIdleConns(viper.GetInt("db.mysql.maxIdleConns"))
sqlDb.SetConnMaxLifetime(time.Hour)
return db
}五、CRUD 接口
創(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ù)查詢
GORM 提供了 First、Take、Last 方法,以便從數(shù)據(jù)庫中檢索單個對象。當查詢數(shù)據(jù)庫時它添加了 LIMIT 1 條件,且沒有找到記錄時,它會返回 ErrRecordNotFound 錯誤
// 獲取第一條記錄(主鍵升序) 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)
更新
當使用 Update 更新單列時,需要有一些條件,否則將會引起ErrMissingWhereClause 錯誤。 當使用 Model 方法,并且它有主鍵值時,主鍵將會被用于構建條件,例如:
// 根據(jù)條件更新
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;
// User 的 ID 是 `111`
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;
// 根據(jù)條件和 model 的值進行更新
db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;刪除
刪除一條記錄時,刪除對象需要指定主鍵,例如:
// Email 的 ID 是 `10`
db.Delete(&email)
// DELETE from emails where id = 10;
// 帶額外條件的刪除
db.Where("name = ?", "jinzhu").Delete(&email)
// DELETE from emails where id = 10 AND name = "jinzhu";原生 SQL
db.Exec("DROP TABLE users")
db.Exec("UPDATE orders SET shipped_at = ? WHERE id IN ?", time.Now(), []int64{1, 2, 3})
// Exec with SQL Expression
db.Exec("UPDATE users SET money = ? WHERE name = ?", gorm.Expr("money * ? + ?", 10000, 1), "jinzhu")到此這篇關于go集成gorm數(shù)據(jù)庫操作代碼的文章就介紹到這了,更多相關go集成gorm數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
GoLang?socket網(wǎng)絡編程傳輸數(shù)據(jù)包時進行長度校驗的方法
在GoLang?socket網(wǎng)絡編程中,為了確保數(shù)據(jù)交互的穩(wěn)定性和安全性,通常會通過傳輸數(shù)據(jù)的長度進行校驗,發(fā)送端首先發(fā)送數(shù)據(jù)長度,然后發(fā)送數(shù)據(jù)本體,接收端則根據(jù)接收到的數(shù)據(jù)長度和數(shù)據(jù)本體進行比較,以此來確認數(shù)據(jù)是否傳輸成功2024-11-11
在golang中使用Sync.WaitGroup解決等待的問題
這篇文章主要介紹了在golang中使用Sync.WaitGroup解決等待的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
Go語言模擬while語句實現(xiàn)無限循環(huán)的方法
這篇文章主要介紹了Go語言模擬while語句實現(xiàn)無限循環(huán)的方法,實例分析了for語句模擬while語句的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02
golang解析json數(shù)據(jù)的4種方法總結
在日常工作中每一名開發(fā)者,不管是前端還是后端,都經(jīng)常使用 JSON,下面這篇文章主要給大家介紹了關于golang解析json數(shù)據(jù)的4種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06

