go集成gorm數(shù)據(jù)庫的操作代碼
一、什么是gorm
GORM 是一個用于 Go 語言的 ORM(對象關(guān)系映射)庫,它提供了一種簡單而強大的方式來與數(shù)據(jù)庫進行交互。GORM 支持多種數(shù)據(jù)庫,包括 MySQL、PostgreSQL、SQLite、SQL Server 等,并且提供了豐富的功能,如自動遷移、預(yù)加載、事務(wù)管理等。
二、特性
- 全功能 ORM
- 關(guān)聯(lián) (Has One,Has Many,Belongs To,Many To Many,多態(tài),單表繼承)
- Create,Save,Update,Delete,F(xiàn)ind 中鉤子方法
- 支持
Preload
、Joins
的預(yù)加載 - 事務(wù),嵌套事務(wù),Save Point,Rollback To Saved Point
- Context、預(yù)編譯模式、DryRun 模式
- 批量插入,F(xiàn)indInBatches,F(xiàn)ind/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUD
- SQL 構(gòu)建器,Upsert,數(shù)據(jù)庫鎖,Optimizer/Index/Comment Hint,命名參數(shù),子查詢
- 復(fù)合主鍵,索引,約束
- 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ù)源設(shè)置 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ù)庫中檢索單個對象。當(dāng)查詢數(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)
更新
當(dāng)使用 Update
更新單列時,需要有一些條件,否則將會引起ErrMissingWhereClause
錯誤。 當(dāng)使用 Model
方法,并且它有主鍵值時,主鍵將會被用于構(gòu)建條件,例如:
// 根據(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")
到此這篇關(guān)于go集成gorm數(shù)據(jù)庫操作代碼的文章就介紹到這了,更多相關(guān)go集成gorm數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang?socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時進行長度校驗的方法
在GoLang?socket網(wǎng)絡(luò)編程中,為了確保數(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-04Go語言模擬while語句實現(xiàn)無限循環(huán)的方法
這篇文章主要介紹了Go語言模擬while語句實現(xiàn)無限循環(huán)的方法,實例分析了for語句模擬while語句的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-02-02golang解析json數(shù)據(jù)的4種方法總結(jié)
在日常工作中每一名開發(fā)者,不管是前端還是后端,都經(jīng)常使用 JSON,下面這篇文章主要給大家介紹了關(guān)于golang解析json數(shù)據(jù)的4種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06