我向 Go 結構添加了一個新屬性,該屬性保留在數據存儲實體類型中。我嘗試使用新屬性上的過濾器加載實體:q := datastore.NewQuery("Person").Filter("Employed =", false)這僅適用于添加新屬性后創建的人員。我曾預計在添加屬性之前創建的人員會包含在過濾器中,但他們根本沒有該屬性,因此被過濾器排除在外。我想了兩種方法來處理這個問題:首先加載所有實體并在第二步中使用循環進行過濾。這增加了代碼的復雜性。批量加載并重新保存所有實體,這會添加屬性并將其設置為 false。每次添加新屬性時,我都必須記住這樣做。有沒有辦法處理這些類型的實體模式更改?
1 回答

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
如果您負擔得起,正確的方法是重新保存舊實體。
您可以使用Python map/reduce 庫來更新舊實體。
如果您想堅持使用 Go,您可以使用任務隊列和查詢游標進行簡單的批處理。
在我們的 Python 應用程序中,只要可能,我們更喜歡“飛行中的熱更新”方法——新版本加載實體并檢查缺失的屬性。如果某些道具已過時,我們會將它們保留一個月或一個月,然后添加邏輯以刪除它們。這允許逐步遷移并且經常回滾而不會出現問題(發生狗屎)或至少將影響限制在一小部分記錄。此外,它更具成本效益,因為您無需支付額外的讀/寫費用。一旦我們確定我們可以運行 mapreduce。這不涉及停機時間。您可能需要或不需要停機時間 - 這實際上取決于您的更改。
使用 Go 可能會有點棘手,因為如果您嘗試加載在結構上沒有相應字段的實體,Go 會恐慌。應該有一些解決方法(我記得一些關于特殊接口或可以加載任意實體的結構),但我在 GAE 上還沒有太多實踐經驗。
- 1 回答
- 0 關注
- 167 瀏覽
添加回答
舉報
0/150
提交
取消