gorm整合進(jìn)go-zero的實(shí)現(xiàn)方法
go-zero提供的代碼生成器里面,沒有提供orm框架操作,但是提供了遍歷的緩存操作。但是gorm框架的話,沒有比較好的緩存插件,雖然有一個(gè)gcache,但不支持gorm2.0版本。
所以我打算把這兩個(gè)結(jié)合起來。在gorm官方文檔中提到了一個(gè)接口,可以獲取到生成的sql語句。
所以可以利用gorm當(dāng)作一個(gè)sql語句的生成器,把生成后的sql語句放到go-zero生成的模板中去執(zhí)行。
gorm中的sql生成器
stmt := DB.Session(&Session{DryRun: true}).First(&user, 1).Statement
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = $1 ORDER BY `id`
stmt.Vars //=> []interface{}{1}整合到go-zero中的效果如下
調(diào)用GeneralSQL,使用gorm生成sql后,去執(zhí)行
func (m *defaultJojUserModel) FindOne(id int64) (*JojUser, error) {
jojUsercenterJojUserIdKey := fmt.Sprintf("%s%v", cacheJojUsercenterJojUserIdPrefix, id)
var resp JojUser
err := m.QueryRow(&resp, jojUsercenterJojUserIdKey, func(conn sqlx.SqlConn, v interface{}) error {
query, values := m.GeneralSQL(func(tx *gorm.DB) *gorm.DB {
return tx.First(&resp, id)
})
return conn.QueryRow(v, query, values...)
})
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}
func (m *defaultJojUserModel) GeneralSQL(queryFn func(tx *gorm.DB) *gorm.DB) (string, []interface{}) {
tx := queryFn(m.gormDB.Session(&gorm.Session{DryRun: true}))
stmt := tx.Statement
return stmt.SQL.String(), stmt.Vars
}
關(guān)于效率的問題,做了一個(gè)簡單的測試,使用gorm生成sql的話,生成1e5次耗時(shí)304.1878ms
type ArticleComment struct {
Id int `json:"id"`
Content string `json:"content"`
ReplyComment *ArticleComment `json:"replyToComment"` // 該評(píng)論回復(fù)的評(píng)論
ParentCommentId int `json:"parentCommentId"` // 父評(píng)論Id
ChildComment []ArticleComment `json:"childComment"` //以該評(píng)論未父節(jié)點(diǎn)的所有評(píng)論
CreateTime string `json:"createTime"` // 回復(fù)時(shí)間
}
func main() {
begin := time.Now()
for i := 0; i < 100000; i++ {
GeneralSQL(func(tx *gorm.DB) *gorm.DB {
return tx.Find(&Article{}, []int{1, 2})
})
}
end := time.Now()
fmt.Println(end.Sub(begin))
func GeneralSQL(queryFn func(tx *gorm.DB) *gorm.DB) (string, []interface{}) {
tx := queryFn(db.Session(&gorm.Session{DryRun: true}))
stmt := tx.Statement
return stmt.SQL.String(), stmt.Vars到此這篇關(guān)于gorm整合進(jìn)go-zero的方法的文章就介紹到這了,更多相關(guān)gorm整合進(jìn)go-zero內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang使用singleflight解決并發(fā)重復(fù)請(qǐng)求
高并發(fā)的場景下,經(jīng)常會(huì)出現(xiàn)并發(fā)重復(fù)請(qǐng)求資源的情況,singleflight是golang內(nèi)置的一個(gè)包,這個(gè)包提供了對(duì)重復(fù)函數(shù)調(diào)用的抑制功能,所以下面我們就來看看如何使用它解決并發(fā)重復(fù)請(qǐng)求吧2023-08-08
Golang 并發(fā)讀寫鎖的具體實(shí)現(xiàn)
Go語言中的sync.RWMutex提供了讀寫鎖機(jī)制,允許多個(gè)協(xié)程并發(fā)讀取共享資源,但在寫操作時(shí)保持獨(dú)占性,本文主要介紹了Golang 并發(fā)讀寫鎖的具體實(shí)現(xiàn),感興趣的可以了解一下2025-02-02
解決Go中使用seed得到相同隨機(jī)數(shù)的問題
這篇文章主要介紹了Go中使用seed得到相同隨機(jī)數(shù)的問題,需要的朋友可以參考下2019-10-10
Golang學(xué)習(xí)筆記(五):函數(shù)
這篇文章主要介紹了Golang學(xué)習(xí)筆記(五):函數(shù)的相關(guān)資料,本文講解了基本語法、多返回值及命名返回參數(shù)、參數(shù)傳遞:傳值與傳指針、參數(shù)傳遞:可變參數(shù)、匿名函數(shù)、函數(shù)作為值、類型等內(nèi)容,需要的朋友可以參考下2015-05-05

