【问题标题】:Appengine's datastore Cursor never changesAppengine 的数据存储区光标永远不会改变
【发布时间】:2017-03-11 18:29:25
【问题描述】:

我正在尝试更新很多记录,在给定的一分钟最大请求时间内无法完成,因此我需要使用 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)
}

【问题讨论】:

    标签: google-app-engine go


    【解决方案1】:

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

    【讨论】:

    • 我想你可能是对的 :) 当我有机会回到那个项目时,我会告诉你这是否是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多