2017-03-11 42 views
2

我想更新大量的記錄,在給定的一分鐘內最大請求時間內無法完成,所以我需要使用datastore.Cursor,但由於某種原因返回的光標是總是一樣。因此,每個重定向都使用相同的遊標值完成,導致每次執行相同的20個數據庫更新。Appengine的數據存儲光標永遠不會改變

任何想法爲什麼事情不像我想的那樣工作?

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) 
} 

回答

1

我看了一些我自己的遊標代碼,並將它與你的遊標進行了比較。我看到的主要區別是我使用q = q.Start(cursor)而不是q.start(cursor)。這應該解決您的問題,因爲您的查詢現在將被更新以反映光標指定的位置。如果不將查詢存儲回q變量,您的查詢將不會更新。

+1

我想你可能是對的:)我會讓你知道如果這是我有機會翻轉回該項目的問題。 – chris

相關問題