GORM 通过 WithContext
方法提供了 Context 支持
单会话模式
单会话模式通常被用于执行单次操作
db.WithContext(ctx).Find(&users) |
持续会话模式
持续会话模式通常被用于执行一系列操作,例如:
tx := db.WithContext(ctx) |
Context 超时
对于长 Sql 查询,你可以传入一个带超时的 context 给 db.WithContext
来设置超时时间,例如:
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) |
Hooks/Callbacks 中的 Context
您可以从当前 Statement
中访问 Context
对象,例如︰
func (u *User) BeforeCreate(tx *gorm.DB) (err error) { |
Chi 中间件示例
在处理 API 请求时持续会话模式会比较有用。例如,您可以在中间件中为 *gorm.DB
设置超时 Context,然后使用 *gorm.DB
处理所有请求
下面是一个 Chi 中间件的示例:
func SetDBMiddleware(next http.Handler) http.Handler { |
注意 通过
WithContext
设置的Context
是线程安全的,参考会话获取详情
Logger
Logger 也可以支持 Context
,可用于日志追踪,查看 Logger 获取详情