我在 go-appengine 的數據存儲中使用命名空間,大致如下: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,沒有辦法手動獲取密鑰的“命名空間”字段以手動驗證它。這對我們的應用很重要,因為我們有來自 Web 客戶端的密鑰,在某些極端情況下,這些密鑰可能與錯誤的命名空間相關聯。OTOH,如果我使用的鍵作為祖先進行查詢Thing,數據存儲(適當地)返回錯誤,因為祖先的命名空間與上下文(形式query namespace is 'bar' but ancestor namespace is 'foo')的命名空間不匹配。我是否遺漏了一些關于數據存儲提取/查詢和命名空間的預期約束,或者這聽起來像是一個錯誤?
1 回答

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