第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 golang 中使用 datastore.GetAll 沒有得到結果

在 golang 中使用 datastore.GetAll 沒有得到結果

Go
絕地無雙 2022-01-04 15:42:18
我有兩個功能:一個將實體寫入數(shù)據(jù)存儲,另一個假設檢索它們。當我datastore.GetAll()在檢索中使用函數(shù)時,它不返回任何結果。我確實有一個測試來驗證寫作似乎工作正常。關于為什么檢索不起作用的任何想法?這是應用程序代碼:package trackerimport (   "fmt"   "appengine"   "appengine/datastore")type User struct {    Email string}func createUser(ctx appengine.Context, email string) (*datastore.Key, error) {    u := &User{        Email: email,        }    incompleteKey := datastore.NewIncompleteKey(ctx, "User", nil)    key, err := datastore.Put(ctx, incompleteKey, u)    if err != nil {        return key, err    }    return key, nil}func getUser(ctx appengine.Context, email string) (u *User, e error) {    users := []User{}    q := datastore.NewQuery("User").Filter("Email", email)    keys, err := q.GetAll(ctx, &users)    if err != nil {        return nil, err    }    fmt.Printf("KEYS: %v", keys)    return &users[0], nil}這是測試代碼:package trackerimport (    "fmt"    "testing"    "appengine/datastore"    "appengine/aetest")// This test is passing.func TestCreateUser(t *testing.T) {    ctx, err := aetest.NewContext(nil)    if err != nil {        t.Fatal(err)    }    defer ctx.Close()    email := "testing@testing.go"    newKey, err := createUser(ctx, email)    if err != nil {        t.Errorf("Failed to create a new user: %v", err)    }    u := User{}    datastore.Get(ctx, newKey, &u)    if u.Email != email {        t.Errorf("Expected email to be %s, found %v.", email, u.Email)    }}func TestGetUser(t *testing.T) {    ctx, err := aetest.NewContext(nil)    if err != nil {        t.Fatal(err)    }    defer ctx.Close()    email := "testing@testing.go"    newKey, err := createUser(ctx, email)    fmt.Printf("key, %v; ", newKey)    u, err := getUser(ctx, newKey)    fmt.Printf("user, %v; error: %s", u, err)    if u.Email != email {        t.Error("Expected email to be %s, found %v.", email, u.Email)    }}
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

datastore.GetAll()不會將結果返回給您,因為該查詢最終一致性適用。SDK 模擬最終一致性,不會立即返回新保存的實體。


但是在您TestCreateUser()使用的方法中datastore.Get(),即使實體是新保存的(“剛剛”),它也會返回給您,因為它是通過鍵查找,并且它們是高度一致的。


幕后發(fā)生的事情是,當您調用 時datastore.Put(),實體數(shù)據(jù)(屬性的值)被保存,其鍵被索引,然后datastore.Put()返回,其他屬性的索引和復合索引在“后臺”異步更新。因此,如果您嘗試執(zhí)行使用索引來查找/列出實體的查詢(您通過Email屬性查詢),則該查詢將不會看到(不會包括)新實體,直到它們被正確索引。當您執(zhí)行 a 時datastore.Get(),它通過鍵而不是其他(非鍵屬性或復合)索引加載實體,因此通過鍵獲取實體將“立即”(datastore.Put()返回后)看到新實體。


如果您想在本地環(huán)境中對此進行測試,您可以StronglyConsistentDatastore在創(chuàng)建將用于創(chuàng)建新上下文的實例時提供選項,如下所示:


inst, err := aetest.NewInstance(&aetest.Options{StronglyConsistentDatastore: true})

if err != nil {

    t.Fatalf("Failed to create instance: %v", err)

}

defer inst.Close()


req, err := inst.NewRequest("GET", "/", nil)

if err != nil {

    t.Fatalf("Failed to create req: %v", err)

}

ctx := appengine.NewContext(req)

另請注意,如果您使用 sleep(例如time.Sleep(time.Millisecond * 500)),datastore.GetAll()也將返回新實體,但上述選項是測試這一點的正確方法。


查看完整回答
反對 回復 2022-01-04
  • 1 回答
  • 0 關注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號