GoZero實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL單例模式連接的簡(jiǎn)單示例
1. 定義數(shù)據(jù)庫(kù)連接的單例結(jié)構(gòu)
首先,你需要定義一個(gè)數(shù)據(jù)庫(kù)連接的結(jié)構(gòu)體,并在初始化時(shí)保證只有一個(gè)連接。
package database import ( "fmt" "log" "sync" "gorm.io/driver/mysql" "gorm.io/gorm" ) var ( db *gorm.DB once sync.Once ) // InitDB 初始化數(shù)據(jù)庫(kù)連接 func InitDB(dsn string) { once.Do(func() { var err error db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("failed to connect database: %v", err) } fmt.Println("Database connected successfully") }) } // GetDB 獲取數(shù)據(jù)庫(kù)連接 func GetDB() *gorm.DB { if db == nil { log.Fatal("Database is not initialized") } return db }
2. 說(shuō)明
once.Do
:保證InitDB
函數(shù)只會(huì)執(zhí)行一次,即使多次調(diào)用也只會(huì)初始化數(shù)據(jù)庫(kù)連接一次。dsn
:你需要傳入數(shù)據(jù)庫(kù)連接的 DSN(Data Source Name),通常是類(lèi)似username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
這樣的格式。GetDB()
:返回?cái)?shù)據(jù)庫(kù)的連接,如果數(shù)據(jù)庫(kù)未初始化,會(huì)觸發(fā)錯(cuò)誤。
3. 如何使用
在你的業(yè)務(wù)代碼中,只需要調(diào)用 InitDB
初始化數(shù)據(jù)庫(kù)連接,然后使用 GetDB
獲取到數(shù)據(jù)庫(kù)連接進(jìn)行操作。
package main import ( "log" "myapp/database" ) func main() { // 初始化數(shù)據(jù)庫(kù)連接 database.InitDB("root:password@tcp(localhost:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local") // 獲取數(shù)據(jù)庫(kù)連接 db := database.GetDB() // 執(zhí)行數(shù)據(jù)庫(kù)操作,比如查詢(xún)數(shù)據(jù) var user User if err := db.First(&user).Error; err != nil { log.Fatalf("Error querying user: %v", err) } // 輸出查詢(xún)結(jié)果 log.Printf("User: %+v", user) }
4. 完整示例
假設(shè)你的 User
結(jié)構(gòu)體是如下定義的:
package main type User struct { ID uint `gorm:"primaryKey"` Name string `gorm:"size:255"` }
通過(guò)這樣的方式,你可以保證在應(yīng)用程序的整個(gè)生命周期內(nèi),數(shù)據(jù)庫(kù)連接僅會(huì)被創(chuàng)建一次,從而實(shí)現(xiàn)了數(shù)據(jù)庫(kù)連接的單例模式。
總結(jié)
這種方式使用 sync.Once
來(lái)保證數(shù)據(jù)庫(kù)連接在應(yīng)用中只有一個(gè)實(shí)例,并提供 InitDB
和 GetDB
函數(shù)來(lái)初始化和獲取數(shù)據(jù)庫(kù)連接。這種方式非常適合于 GoZero 框架的項(xiàng)目,可以有效減少不必要的數(shù)據(jù)庫(kù)連接創(chuàng)建。
到此這篇關(guān)于GoZero實(shí)現(xiàn)數(shù)據(jù)庫(kù)MySQL單例模式連接的簡(jiǎn)單示例的文章就介紹到這了,更多相關(guān)GoZero MySQL單例模式連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用
這篇文章主要為大家介紹了Golang中unicode碼和中文的互相轉(zhuǎn)換函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Go并發(fā)同步Mutex典型易錯(cuò)使用場(chǎng)景
這篇文章主要為大家介紹了Go并發(fā)同步Mutex典型易錯(cuò)使用場(chǎng)景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08golang post請(qǐng)求常用的幾種方式小結(jié)
這篇文章主要介紹了golang post請(qǐng)求常用的幾種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Kotlin編程基礎(chǔ)語(yǔ)法編碼規(guī)范
這篇文章主要為大家介紹了Kotlin編程條件控制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine)
本文主要介紹了Go中阻塞以及非阻塞操作實(shí)現(xiàn)(Goroutine和main Goroutine),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05Fedora14 Linux系統(tǒng)安裝Golang開(kāi)發(fā)環(huán)境筆記
這篇文章主要介紹了Fedora14 Linux系統(tǒng)安裝Golang開(kāi)發(fā)環(huán)境筆記,本文講解了2種安裝方法,需要的朋友可以參考下2014-10-10