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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何過濾 GAE 查詢?

如何過濾 GAE 查詢?

Go
慕哥6287543 2021-09-27 10:38:09
我正在嘗試保存兩條記錄,然后獲取第二條記錄。問題是過濾器似乎不起作用。雖然我按姓名(“Andrew W”)過濾,但我總是得到“Joe Citizen”。計(jì)數(shù)器還指示 2 條記錄,而它應(yīng)該只有 1 條記錄。這讓我發(fā)瘋。請(qǐng)參閱下面的完整代碼。結(jié)果打印counter 2 e2 {"Joe Citizen" "Manager" "2015-03-24 09:08:58.363929 +0000 UTC" ""}package mainimport (    "fmt"    "time"    "net/http"    "google.golang.org/appengine"    "google.golang.org/appengine/datastore")type Employee struct {    Name     string    Role     string    HireDate time.Time    Account  string}func init(){    http.HandleFunc("/", handle)}func handle(w http.ResponseWriter, r *http.Request) {    c := appengine.NewContext(r)    e1 := Employee{        Name:     "Joe Citizen",        Role:     "Manager",        HireDate: time.Now(),    }    _, err := datastore.Put(c, datastore.NewKey(c, "employee", "", 0, nil), &e1)    if err != nil {        http.Error(w, err.Error(), http.StatusInternalServerError)    panic(err)        return    }    e1.Name = "Andrew W"    _, err = datastore.Put(c, datastore.NewKey(c, "employee", "", 0, nil), &e1)    if err != nil {        http.Error(w, err.Error(), http.StatusInternalServerError)    panic(err)        return    }    var e2 Employee    q :=  datastore.NewQuery("employee")    q.Filter("Name =", "Andrew W")    cnt, err  := q.Count(c)    if err !=nil{        http.Error(w, err.Error(), http.StatusInternalServerError)        panic(err)        return    }    for t := q.Run(c); ; {          if _, err := t.Next(&e2); err != nil {             http.Error(w, err.Error(), http.StatusInternalServerError)            panic(err)            return        }        break    }       fmt.Fprintf(w, "counter %v e2 %q", cnt, e2)}
查看完整描述

1 回答

?
aluckdog

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ǔ)一些附加信息,但如上所述,它不一定是。


查看完整回答
反對(duì) 回復(fù) 2021-09-27
  • 1 回答
  • 0 關(guān)注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)