我在 go-appengine 的數(shù)據(jù)存儲中使用命名空間,大致如下:func getThing() *Thing { nctx := appengine.Namespace(ctx, "whatever") thing := Thing{} key, err := datastore.Get(nctx, key, &thing) if err != nil { return nil, err } return thing, nil}夠簡單了吧?不幸的是,如果事實證明如果 nctx 的命名空間與鍵的命名空間不匹配,它無論如何都會很高興地獲取該對象。AFAICT,沒有辦法手動獲取密鑰的“命名空間”字段以手動驗證它。這對我們的應(yīng)用很重要,因為我們有來自 Web 客戶端的密鑰,在某些極端情況下,這些密鑰可能與錯誤的命名空間相關(guān)聯(lián)。OTOH,如果我使用的鍵作為祖先進行查詢Thing,數(shù)據(jù)存儲(適當(dāng)?shù)兀┓祷劐e誤,因為祖先的命名空間與上下文(形式query namespace is 'bar' but ancestor namespace is 'foo')的命名空間不匹配。我是否遺漏了一些關(guān)于數(shù)據(jù)存儲提取/查詢和命名空間的預(yù)期約束,或者這聽起來像是一個錯誤?
1 回答

鴻蒙傳說
TA貢獻1865條經(jīng)驗 獲得超7個贊
我假設(shè)您正在傳遞編碼的密鑰,而不僅僅是它們的 ID?如果您使用創(chuàng)建鍵,datastore.NewKey
則傳遞給它的上下文將設(shè)置鍵的命名空間(除非還有父項,在這種情況下將使用其命名空間)。
就意圖而言,此行為等效于 python API - 在 上設(shè)置不同的命名空間時,可以獲取從 urlsafe 字符串創(chuàng)建的密鑰namespace_mananger
,但如果您僅通過指定創(chuàng)建密鑰,則使用當(dāng)前設(shè)置的命名空間種類和身份。
不過,為命名空間設(shè)置一個 getter 會很好,所以您至少可以在反序列化后進行驗證...
- 1 回答
- 0 關(guān)注
- 233 瀏覽
添加回答
舉報
0/150
提交
取消