gopackage repository
import (
"context"
"next-terminal/server/constant"
"next-terminal/server/env"
"gorm.io/gorm"
)
type baseRepository struct {
}
func (b *baseRepository) GetDB(c context.Context) *gorm.DB {
db, ok := c.Value(constant.DB).(*gorm.DB)
if !ok {
return env.GetDB()
}
return db
}
其中定义了一个基础的baseRepository,所有的rep全部组合baseRepository,然后通过GetDB方法获取其中的gorm.DB.目前来看,这种方式可以减少大量的repo的初始化过程,新创建的repo只需要组合baseRepository即可正常的使用gorm.DB. 这里使用它来存储一个gorm.DB,数据,以便每次需要使用时直接在context中取出来.
单一会话模式
db.WithContext(ctx).Find(&users)
这种情况下,我不太理解这样用的目的,但可以将其中的ctx初始化为一个超时返回contextctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
,这样的话,可以在sql语句超时后及时返回.
连续会话模式 这个是我觉得最有用的一种context的使用,使用context将多条语句的操作联系起来.
gotx := db.WithContext(ctx)
tx.First(&user, 1)
tx.Model(&user).Update("role", "admin")
gofunc SetDBMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
timeoutContext, _ := context.WithTimeout(context.Background(), time.Second)
ctx := context.WithValue(r.Context(), "DB", db.WithContext(timeoutContext))
next.ServeHTTP(w, r.WithContext(ctx))
})
}
r := chi.NewRouter()
r.Use(SetDBMiddleware)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
db, ok := ctx.Value("DB").(*gorm.DB)
var users []User
db.Find(&users)
// lots of db operations
})
本文作者:独语天涯
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!