2 回答

TA貢獻(xiàn)1786條經(jīng)驗 獲得超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貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
目前,gorm 似乎沒有context.Context像 eg那樣實現(xiàn)任何接受作為參數(shù) a 的查詢QueryRowContext。
您可以創(chuàng)建一種解決方法并使用 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
}
}
然后在您的上層函數(shù)中,無論它是什么,您都可以創(chuàng)建一個上下文并將其傳遞給MyQueryFunction. 如果查詢超過了您設(shè)置的時間,則會引發(fā)錯誤,您應(yīng)該(必須)檢查它。
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)
}
當(dāng)然,這只是一個例子,沒有考慮很多用例,必須首選框架內(nèi)的正確實現(xiàn)。
- 2 回答
- 0 關(guān)注
- 688 瀏覽
添加回答
舉報