脈絡

GORM 的脈絡支援,由 WithContext 方法啟用,是一個強大的功能,它增強了 Go 應用程式中資料庫操作的彈性和控制力。它允許在不同的操作模式、逾時設定,甚至整合到掛鉤/回呼和中間件中進行脈絡管理。讓我們深入探討這些不同的面向

單一工作階段模式

單一工作階段模式適合執行個別操作。它確保特定操作在脈絡的範圍內執行,允許更好的控制和監控。

db.WithContext(ctx).Find(&users)

持續工作階段模式

持續工作階段模式非常適合執行一系列相關操作。它在這些操作中維護脈絡,這在交易等場景中特別有用。

tx := db.WithContext(ctx)
tx.First(&user, 1)
tx.Model(&user).Update("role", "admin")

脈絡逾時

在傳遞給 db.WithContext 的脈絡上設定逾時,可以控制長時間執行查詢的持續時間。這對於維持效能和避免資料庫互動中的資源鎖定至關重要。

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

db.WithContext(ctx).Find(&users)

掛鉤/回呼中的脈絡

脈絡也可以在 GORM 的掛鉤/回呼中存取。這允許在這些生命週期事件中使用脈絡資訊。

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
ctx := tx.Statement.Context
// ... use context
return
}

與 Chi 中間件整合

GORM 的脈絡支援延伸到網路伺服器中間件,例如 Chi 路由器中的中間件。這允許為網路請求範圍內的所有資料庫操作設定具有逾時的脈絡。

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))
})
}

// Router setup
r := chi.NewRouter()
r.Use(SetDBMiddleware)

// Route handlers
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
db, ok := r.Context().Value("DB").(*gorm.DB)
// ... db operations
})

r.Get("/user", func(w http.ResponseWriter, r *http.Request) {
db, ok := r.Context().Value("DB").(*gorm.DB)
// ... db operations
})

注意:使用 WithContext 設定 Context 是 goroutine 安全的。這確保資料庫操作在多個 goroutine 中安全地管理。有關更多詳細資訊,請參閱 GORM 中的 Session 文件

Logger Integration

GORM 的記錄器也接受 Context,可用於記錄追蹤和與現有的記錄基礎架構整合。

有關更多詳細資訊,請參閱 Logger 文件

白金贊助商

黃金贊助商

白金贊助商

黃金贊助商