GoFrame 數(shù)據(jù)庫ORM-上下文變量

2022-04-02 14:25 更新

?ORM?支持傳遞自定義的?context?上下文變量,用于異步?IO?控制、上下文信息傳遞(特別是鏈路跟蹤信息的傳遞)、以及嵌套事務支持。

我們可以通過?Ctx?方法傳遞自定義的上下文變量給?ORM?對象,?Ctx?方法其實是一個鏈式操作方法,該上下文傳遞進去后僅對當前?DB?接口對象有效,方法定義如下:

func Ctx(ctx context.Context) DB

請求超時控制

我們來看一個通過上下文變量控制請求超時時間的示例。

ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
_, err := db.Ctx(ctx).Query("SELECT SLEEP(10)")
fmt.Println(err)

該示例中執(zhí)行會sleep 10秒中,因此必定會引發(fā)請求的超時。執(zhí)行后,輸出結果為:

context deadline exceeded, SELECT SLEEP(10)

鏈路跟蹤信息

上下文變量也可以傳遞鏈路跟蹤信息,并且可以和日志組件結合,將鏈路信息打印到日志中(僅當?ORM?日志開啟時)。

模型上下文操作

模型對象也支持上下文變量的傳遞,同樣也是通過?Ctx?方法。我們來看一個簡單的示例,我們將示例2的例子通過模型操作調整一下。

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	_, err := g.DB().Model("user").Ctx(gctx.New()).All()
	if err != nil {
		panic(err)
	}
}

執(zhí)行后,終端輸出為:

2020-12-28 23:46:56.349 [DEBU] {38d45cbf2743db16f1062074f7473e5c} [  5 ms] [default] [rows:0  ] SHOW FULL COLUMNS FROM `user`
2020-12-28 23:46:56.354 [DEBU] {38d45cbf2743db16f1062074f7473e5c} [  5 ms] [default] [rows:100] SELECT * FROM `user`

其中?SHOW FULL COLUMNS FROM `user`?為?ORM?組件的數(shù)據(jù)表字段獲取查詢,每個表在執(zhí)行操作之前僅會查詢一次并緩存結果到內存中。

嵌套事務支持

嵌套事務的支持依賴?Context?上下文變量的層級傳遞。


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號