新聞中心
這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame 數(shù)據(jù)庫ORM-上下文變量
?ORM?支持傳遞自定義的?context?上下文變量,用于異步?IO?控制、上下文信息傳遞(特別是鏈路跟蹤信息的傳遞)、以及嵌套事務(wù)支持。

我們可以通過?Ctx?方法傳遞自定義的上下文變量給?ORM?對象,?Ctx?方法其實是一個鏈?zhǔn)讲僮鞣椒?,該上下文傳遞進去后僅對當(dāng)前?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í)行后,輸出結(jié)果為:
context deadline exceeded, SELECT SLEEP(10)鏈路跟蹤信息
上下文變量也可以傳遞鏈路跟蹤信息,并且可以和日志組件結(jié)合,將鏈路信息打印到日志中(僅當(dāng)?ORM?日志開啟時)。
模型上下文操作
模型對象也支持上下文變量的傳遞,同樣也是通過?Ctx?方法。我們來看一個簡單的示例,我們將示例2的例子通過模型操作調(diào)整一下。
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í)行操作之前僅會查詢一次并緩存結(jié)果到內(nèi)存中。
嵌套事務(wù)支持
嵌套事務(wù)的支持依賴?Context?上下文變量的層級傳遞。
本文名稱:創(chuàng)新互聯(lián)GoFrame教程:GoFrame 數(shù)據(jù)庫ORM-上下文變量
轉(zhuǎn)載源于:http://m.fisionsoft.com.cn/article/djhpoch.html


咨詢
建站咨詢
