最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go集成gorm數(shù)據(jù)庫的操作代碼

 更新時間:2024年11月07日 08:53:36   作者:hlsd#  
GORM 是一個用于 Go 語言的 ORM(對象關(guān)系映射)庫,它提供了一種簡單而強大的方式來與數(shù)據(jù)庫進行交互,GORM 支持多種數(shù)據(jù)庫,并且提供了豐富的功能,如自動遷移、預(yù)加載、事務(wù)管理等,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

一、什么是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中interface是引用類型的原因解析

    Golang中interface是引用類型的原因解析

    在Go語言中,將interface設(shè)計為引用類型是為了實現(xiàn)更靈活、更動態(tài)的類型系統(tǒng),這篇文章主要介紹了深度解析Golang中為什么interface是引用類型,需要的朋友可以參考下
    2024-01-01
  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    這篇文章主要介紹了Golang 中 omitempty的作用,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考一下,需要的小伙伴可以參考一下
    2022-07-07
  • 解決Go語言time包數(shù)字與時間相乘的問題

    解決Go語言time包數(shù)字與時間相乘的問題

    這篇文章主要介紹了Go語言time包數(shù)字與時間相乘的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • golang線程安全的map實現(xiàn)

    golang線程安全的map實現(xiàn)

    這篇文章主要介紹了golang線程安全的map實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • Golang?WaitGroup?底層原理及源碼解析

    Golang?WaitGroup?底層原理及源碼解析

    WaitGroup?是?Golang?中最常見的并發(fā)控制技術(shù)之一,它的作用我們可以簡單類比為其他語言中多線程并發(fā)控制中的?join(),這篇文章主要介紹了Golang?WaitGroup?底層原理及源碼詳解,需要的朋友可以參考下
    2023-04-04
  • 入門學(xué)習(xí)Go的基本語法

    入門學(xué)習(xí)Go的基本語法

    這篇文章主要介紹了Go語法的基本概念,本文講解了Golang的基本知識、基礎(chǔ)語法、相關(guān)術(shù)語等,需要的朋友可以參考下,希望能幫助到你
    2021-07-07
  • 自動生成代碼controller?tool的簡單使用

    自動生成代碼controller?tool的簡單使用

    這篇文章主要為大家介紹了自動生成代碼controller?tool的簡單使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 深入探索Go語言中的高效數(shù)據(jù)結(jié)構(gòu)堆

    深入探索Go語言中的高效數(shù)據(jù)結(jié)構(gòu)堆

    堆,作為一種基本的數(shù)據(jù)結(jié)構(gòu),以其在優(yōu)先隊列和排序算法中提供高效解決方案的能力而聞名。在本文中,我們將深入探討堆的內(nèi)部工作原理,包括其特性、實現(xiàn)細(xì)節(jié)以及在現(xiàn)代編程中的應(yīng)用
    2008-06-06
  • go mod tidy拉取依賴包bug問題及解決

    go mod tidy拉取依賴包bug問題及解決

    這篇文章主要介紹了go mod tidy拉取依賴包bug問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Go語言學(xué)習(xí)之WaitGroup用法詳解

    Go語言學(xué)習(xí)之WaitGroup用法詳解

    Go語言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細(xì)為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06

最新評論

毕节市| 孙吴县| 荆州市| 曲松县| 新民市| 铁力市| 云梦县| 南皮县| 康定县| 威远县| 天镇县| 铁力市| 白城市| 澄江县| 池州市| 合川市| 舞钢市| 华蓥市| 睢宁县| 城固县| 杨浦区| 安泽县| 石首市| 新巴尔虎左旗| 德昌县| 鄂州市| 蒙自县| 惠州市| 信宜市| 双牌县| 都安| 芜湖县| 彭阳县| 中西区| 龙游县| 黄平县| 南澳县| 松潘县| 宜川县| 介休市| 威海市|