# Context
GORM 通過 `WithContext` 方法提供了 Context 支持
## 單會話模式
單會話模式通常被用于執行單次操作
```go
db.WithContext(ctx).Find(&users)
```
## 持續會話模式
持續會話模式通常被用于執行一系列操作,例如:
```go
tx := db.WithContext(ctx)
tx.First(&user, 1)
tx.Model(&user).Update("role", "admin")
```
## Chi 中間件示例
在處理 API 請求時持續會話模式會比較有用。例如,您可以在中間件中為 `*gorm.DB` 設置超時 Context,然后使用 `*gorm.DB` 處理所有請求
下面是一個 Chi 中間件的示例:
```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)
// 以下省略 32 個 DB 操作...
})
r.Get("/user", func(w http.ResponseWriter, r *http.Request) {
db, ok := ctx.Value("DB").(*gorm.DB)
var user User
db.First(&user)
// 以下省略 32 個 DB 操作...
})
```
**注意** 通過 `WithContext` 設置的 `Context` 是線程安全的,參考[會話](http://v2.gorm.io/zh_CN/docs/session.html)獲取詳情
## Logger
Logger 也可以接受 `Context` ,可用于日志追蹤,請參考 [Logger](http://v2.gorm.io/zh_CN/docs/logger.html) **獲取詳情**