1 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
(第一)問題是這樣的:
q := datastore.NewQuery("employee")
q.Filter("Name =", "Andrew W")
Query.Filter()返回包含您指定的過濾器的派生查詢。您必須存儲(chǔ)返回值并持續(xù)使用它:
q := datastore.NewQuery("employee")
q = q.Filter("Name =", "Andrew W")
或者只有一行:
q := datastore.NewQuery("employee").Filter("Name =", "Andrew W")
注意:如果沒有這個(gè),您執(zhí)行的查詢將沒有過濾器,因此將返回所有以前保存的實(shí)體"employee",其中"Joe Citizen"可能是您看到打印的第一個(gè)實(shí)體。
對(duì)于第一次運(yùn)行,您很可能會(huì)看到 0 個(gè)結(jié)果。請(qǐng)注意,由于您不使用祖先查詢,因此最終一致性適用。開發(fā)SDK以最終一致性模擬高復(fù)制數(shù)據(jù)存儲(chǔ),因此Put()操作后的查詢將看不到結(jié)果。
如果time.Sleep()在繼續(xù)查詢之前放一個(gè)小號(hào),您將看到您期望的結(jié)果:
time.Sleep(time.Second)
var e2 Employee
q := datastore.NewQuery("employee").Filter("Name=", "Andrew W")
// Rest of your code...
另請(qǐng)注意,在 SDK 中運(yùn)行您的代碼可以通過創(chuàng)建如下上下文來模擬強(qiáng)一致性:
c, err := aetest.NewContext(&aetest.Options{StronglyConsistentDatastore: true})
但是當(dāng)然這僅用于測(cè)試目的,您不能在生產(chǎn)中執(zhí)行此操作。
如果想要強(qiáng)一致的結(jié)果,請(qǐng)?jiān)趧?chuàng)建鍵時(shí)指定一個(gè)祖先鍵,并使用祖先查詢。僅當(dāng)您想要高度一致的結(jié)果時(shí)才需要祖先鍵。如果您對(duì)顯示結(jié)果的延遲幾秒鐘沒有問題,則不必這樣做。另請(qǐng)注意,祖先鍵不必是現(xiàn)有實(shí)體的鍵,它只是語義。您可以創(chuàng)建任何虛構(gòu)的密鑰。對(duì)多個(gè)實(shí)體使用相同的(虛構(gòu)的)鍵會(huì)將它們放入同一個(gè)實(shí)體組中,并且該組上的祖先查詢將高度一致。
通常,祖先密鑰是現(xiàn)有密鑰,通常從當(dāng)前用戶或帳戶派生,因?yàn)樗梢暂p松創(chuàng)建/計(jì)算,并且它保存/存儲(chǔ)一些附加信息,但如上所述,它不一定是。
- 1 回答
- 0 關(guān)注
- 221 瀏覽
添加回答
舉報(bào)