2022-10-07
Go
00
请注意,本文编写于 659 天前,最后修改于 527 天前,其中某些信息可能已经过时。

目录

next-terminal中的context
Gorm Docs中的context描述

next-terminal中的context

go
package 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中取出来.

Gorm Docs中的context描述

  1. 单一会话模式 db.WithContext(ctx).Find(&users) 这种情况下,我不太理解这样用的目的,但可以将其中的ctx初始化为一个超时返回contextctx, cancel := context.WithTimeout(context.Background(), 2*time.Second),这样的话,可以在sql语句超时后及时返回.

  2. 连续会话模式 这个是我觉得最有用的一种context的使用,使用context将多条语句的操作联系起来.

go
tx := db.WithContext(ctx) tx.First(&user, 1) tx.Model(&user).Update("role", "admin")
  1. 携带值的context 通过context的方式将gorm.DB放在context中,在编写api需要gorm.DB时直接取出,这样看来,和上文next-terminal中的context的使用方式类似.
go
func 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 })
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:独语天涯

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!