嘗試使用 datastore.NewQuery() 過濾 GAE 查詢時,必須將產生的衍生查詢指派給原始 q多變的。這可確保指定的篩選器套用於查詢。此步驟中的疏忽可能會導致不正確的結果或空的查詢結果。
// Incorrect approach: q := datastore.NewQuery("employee") q.Filter("Name =", "Andrew W") // Filter not applied // Correct approach: q := datastore.NewQuery("employee").Filter("Name =", "Andrew W")
此外,在提供的程式碼中,遺失結果的問題可能歸因於最終一致性,這是高複製資料儲存的特徵,在開發SDK中進行模擬。為了克服這個問題,在查詢之前引入一個簡短的 time.Sleep() ,留出時間來解決一致性。
time.Sleep(time.Second) var e2 Employee q := datastore.NewQuery("employee").Filter("Name =", "Andrew W") // Rest of your code...
或者,可以透過使用 aetest.NewContext() 建立上下文並設定來強制強一致性StronglyConsistentDatastore 設為 true。但是,建議僅用於測試目的,在生產中不可用。
對於沒有最終一致性的強一致性,可以使用祖先金鑰。該密鑰可以是虛構的,僅用作將實體分組為實體群組的機制。該組的祖先查詢將產生高度一致的結果。
// Create a fictional ancestor key ancestorKey := datastore.NameKey("EmployeeGroup", "", nil) // Create a key with the ancestor key key := datastore.NameKey("Employee", "Andrew W", ancestorKey) // Create an employee entity with the key employee := &Employee{ Name: "Andrew W", // Other fields... } // Put the entity with the ancestor key _, err := datastore.Put(c, key, employee) if err != nil { // Handle error } // Query for entities with the ancestor key q := datastore.NewQuery("Employee").Ancestor(ancestorKey) results, err := q.GetAll(c, &[]Employee{}) if err != nil { // Handle error }
以上是如何有效過濾 Google App Engine 資料儲存查詢並確保結果一致?的詳細內容。更多資訊請關注PHP中文網其他相關文章!