gpt4 book ai didi

google-app-engine - Appengine 的数据存储 Cursor 永远不会改变

转载 作者:IT王子 更新时间:2023-10-29 01:44:50 25 4
gpt4 key购买 nike

我正在尝试更新大量记录,但无法在给定的一分钟最长请求时间内完成这些记录,因此我需要使用 datastore.Cursor,但由于某种原因,返回的游标始终相同。因此每次重定向都使用相同的游标值完成,导致每次执行相同的 20 次数据库更新。

对于为什么事情没有像我希望的那样工作有什么想法吗?

http.HandleFunc("/fix", func(w, http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)
fixUser(c, w, r, "/fix", func() error {
// do the fix here
return nil
})
})

func fixUser(ctx context.Context, w http.ResponseWriter, r *http.Request, path string, fn func(user *User) error) {
q := datastore.NewQuery("users")
c := r.URL.Query().Get("c")
if len(c) > 0 {
cursor, err := datastore.DecodeCursor(c)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
q.Start(cursor)
}

iter := q.Run(ctx)
var cr datastore.Cursor
for i := 0; i < 20; i++ {
var u User
key, err := iter.Next(&u)
if err == datastore.Done {
return
}
if err != nil {
panic(err.Error())
}
cr, _ = iter.Cursor()
log.Debugf(ctx, "Cursor: %v", cr) // always the same value
u.Key = key
fn(&u)
}

pathWithCursor := fmt.Sprintf("%s?c=%s", path, cr.String())
http.Redirect(w, r, pathWithCursor, 301)
}

最佳答案

我查看了自己的一些游标代码并将其与您的进行了比较。我看到的主要区别是我使用 q = q.Start(cursor) 而不是 q.start(cursor)。这应该可以解决您的问题,因为您的查询现在将更新以反射(reflect)光标指定的位置。如果不将您的查询存储回 q 变量,您的查询将不会更新。

关于google-app-engine - Appengine 的数据存储 Cursor 永远不会改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42738999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com