使用EntGo与Echo框架时,数据库查询所需的Context从哪里获取?
关于Echo框架中获取标准context传入ent查询的解决方案
你可以通过Echo请求上下文封装的HTTP请求对象获取标准库context.Context实例,将代码中????的位置替换为c.Request().Context()即可。
核心说明
- Echo 框架的
echo.Context是框架自定义的请求上下文类型,没有直接实现标准库context.Context接口,它将原生HTTP请求封装在内部,通过Request()方法可以拿到*http.Request实例,调用该实例的Context()方法就能得到和当前请求生命周期绑定的标准context。 - 注意不要使用你在
main函数开头定义的全局根contextctx:这个context没有请求生命周期绑定,不会随请求终止、超时而取消,会导致数据库操作可能出现无意义的资源占用。
修改后的代码示例
e.GET("/hashtags", func(c echo.Context) error { pattern := c.QueryParam("pattern") if len(pattern) == 0 { return c.JSON(http.StatusNotFound, err) } // 直接使用请求绑定的context hs, err := client.Hashtag.Query().All(c.Request().Context()) if err != nil { return c.JSON(http.StatusInternalServerError, err.Error()) } return c.JSON(http.StatusOK, hs) })
进阶用法(添加查询超时)
如果需要给ent的数据库查询单独设置超时时间,可以基于请求context再封装一层超时控制:
import "time" // ... 路由逻辑内 reqCtx := c.Request().Context() // 设置查询超时时间为3秒 ctx, cancel := context.WithTimeout(reqCtx, 3*time.Second) defer cancel() hs, err := client.Hashtag.Query().All(ctx)
内容的提问来源于stack exchange,提问作者softshipper
相关产品推荐
相关产品推荐

