2 回答

TA贡献1786条经验 获得超11个赞
这段代码似乎对我有用,而且很干净。我猜只是使用交易。
//Gorm query below
query = query.Where(whereClause)
//Set up Timeout
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
var x sql.TxOptions
db := query.BeginTx(ctx, &x)
defer db.Commit()
// Execute the query
if err := db.Find(*results).Error; err != nil {
return err
}

TA贡献1794条经验 获得超8个赞
目前,gorm 似乎没有context.Context像 eg那样实现任何接受作为参数 a 的查询QueryRowContext。
您可以创建一种解决方法并使用 Context 使您的查询“过期”。
type QueryResponse struct {
MyResult *MyResult
Error error
}
func queryHelper(ctx context.Context) <- chan *QueryResponse {
chResult := make(chan *QueryResponse, 1)
go func() {
//your query here
//...
//blah blah check stuff do whatever you want
//err is an error that comes from the query code
if err != nil {
chResult <- &QueryResponse{nil, err}
return
}
chResult <- &QueryResponse{queryResponse, nil}
} ()
return chResult
}
func MyQueryFunction(ctx context.Context) (*MyResult, error) {
select {
case <-ctx.Done():
return nil, fmt.Errorf("context timeout, query out of time")
case res := <-queryHelper(ctx):
return res.MyResult, res.Error
}
}
然后在您的上层函数中,无论它是什么,您都可以创建一个上下文并将其传递给MyQueryFunction. 如果查询超过了您设置的时间,则会引发错误,您应该(必须)检查它。
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
res, err := MyQueryFunction(ctx)
if err != nil {
fmt.Printf("err %v", err)
} else {
fmt.Printf("res %v", res)
}
当然,这只是一个例子,没有考虑很多用例,必须首选框架内的正确实现。
- 2 回答
- 0 关注
- 668 浏览
添加回答
举报