2016-04-15 12 views
1

私は2つの機能を持っています.1つはエンティティをデータストアに書き込み、もう1つはデータストアに取り込むものです。私がdatastore.GetAll()機能を私の検索に使用すると結果が返されません。私は、その文章が正しく動作しているかどうかを確認するテストをしています。検索がうまくいかない理由に関するアイデアはありますか?ここでデータストアで結果が得られませんゴランのゲットアイル

は、アプリケーション・コードである:ここで

package tracker 

import (
    "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 tracker 

import (
    "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 := "[email protected]" 
    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 := "[email protected]" 
    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) 
    } 
} 

答えて

5

datastore.GetAll()はあなたに結果を返しません。 SDKは最終的な一貫性をシミュレートし、直ちに新しく保存されたエンティティをすぐに返すことはありません。それがキーによる検索だ、と彼らは強く一貫ているので、それが新たにした場合でも、あなたのエンティティを返します

しかし、あなたのTestCreateUser()方法であなたがdatastore.Get()を使用し、(「今は」)、保存されました。

datastore.Put()を呼び出すと、エンティティデータ(プロパティの値)が保存され、そのキーがインデックスされ、datastore.Put()が返され、他のプロパティとコンポジットインデックスのインデックスが非同期に更新されます。バックグラウンド"。そのため、インデックスを使用してクエリを実行しようとすると、クエリは適切なインデックスが作成されるまで新しいエンティティが表示されません(含まれません)。 datastore.Get()を実行すると、他の(キー以外のプロパティまたはコンポジット)インデックスではなく、そのキーによってエンティティが読み込まれるため、キーでエンティティを取得すると、新しいエンティティがすぐに表示されます(datastore.Put()が返された後)。

あなたはローカル環境でこれをテストしたい場合は、新しいコンテキストを作成するために使用されるインスタンスを作成するとき、あなたはこのように、StronglyConsistentDatastoreオプションを提供することができる:

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()も新しいエンティティを返しますが、上記のオプションはこれをテストする適切な方法です。

数多くの類似した質問(+答えは)ありますが、詳細はそれらを読む:魅力のように働いた

Google App Engine Datastore - Testing Queries fails

How to filter a GAE query?

Google app engine datastore query with cursor won't iterate all items

+0

感謝を! – katkinson

+1

@katkinsonそれが働いたので、適切なことは、左側の隣にあるチェックマークをクリックすることで答えを受け入れるようにマークすることです。 http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-workこれは、将来の読者がその答えがその問題を解決したことを知りましょう。 – sberry

関連する問題