GAE 中的查询过滤:解决不一致的结果和计数器差异
考虑以下场景:两条记录插入到数据存储中,其中一条带有一个名字是“Joe Citizen”,另一个名字是“Andrew W.”。但是,当执行后续查询来检索名为“Andrew W”的记录时,它意外返回“Joe Citizen”,这表明查询过滤器无法正常运行。此外,计数器显示 2,表明存在两条记录,而实际上预计只有一条记录。需要对此问题进行调查,以纠正查询过滤并解决不一致问题。
了解查询过滤
该问题源于初始查询构造中的疏忽。在 Go 的 Datastore API 中,Query.Filter() 方法返回一个应用了指定过滤器的新查询对象。它不会修改原始查询对象。因此,将返回的查询分配给新变量至关重要:
// Incorrect approach that does not apply the filter q := datastore.NewQuery("employee") q.Filter("Name =", "Andrew W") // Correct approach that assigns the new query with the filter applied q = datastore.NewQuery("employee").Filter("Name =", "Andrew W")
解决最终一致性
GAE 数据存储遵循最终一致性,这意味着数据更新可能不会立即对后续查询可见。为了解决这个问题,请在查询执行的代码中引入短暂的延迟,以便有足够的时间来传播数据:
time.Sleep(time.Second) var e2 Employee q := datastore.NewQuery("employee").Filter("Name=", "Andrew W")
可选增强
对于如果结果高度一致,请在创建密钥时考虑使用祖先密钥并使用祖先查询。祖先键确保同一实体组内的操作得到一致的处理,而不管最终的一致性考虑因素:
key := datastore.NewKey(c, "employee", "", 0, ancestorKey)
最终,通过解决这些问题,查询过滤将按预期运行,返回预期的记录并准确反映数据存储中的计数器值。
以上是为什么我的 Google App Engine 数据存储区查询返回不一致的结果并显示不正确的计数器值?的详细内容。更多信息请关注PHP中文网其他相关文章!