2012-01-20 82 views
2

我剛開始用Go運行時開發一個GAE應用程序,迄今爲止它是一種樂趣。但是,我遇到了以下的挫折:如何忽略datastore.Query.GetAll()中的錯誤?

我利用了數據存儲提供的靈活性,通過將具有不同屬性的幾個不同結構以相同的實體名稱(「項目」)進行保存。 Go language datastore reference指出「傳遞的實際類型不必在Get和Put調用之間或甚至跨不同的App Engine請求匹配」,因爲實體實際上只是一系列屬性,因此可以存儲在適當的容器類型中支持他們。

我需要查詢存儲在實體名稱「Item」下的所有實體,並將它們一次編碼爲JSON。使用該實體屬性靈活性對我有利,可以將查詢的實體存儲到任意datastore.PropertyList中,但是,當查詢的實體的屬性不能被正確表示時(也就是說,當查詢的實體的屬性不能被正確表示時,GetGetAll函數返回ErrFieldMismatch作爲錯誤)不兼容的類型,或者只是缺少的值)。我保存的所有這些結構都是用戶生成的,大多數值都是可選的,因此將空值保存到數據存儲中。使用空值保存這些結構體時不會有任何問題(數據存儲區的靈活性),但是在檢索它們時有問題。

在數據存儲Go文檔中還聲明,由Get方法的調用者決定由於空值返回的錯誤是可以忽略,可恢復的還是致命的。我想知道如何正確地做到這一點,因爲只是忽略這些錯誤是不夠的,因爲當查詢導致此錯誤時,我的查詢的目標結構(datastore.PropertyList)根本沒有填充。

預先感謝您,對於冗長的問題感到抱歉。

更新:下面是一些代碼

query := datastore.NewQuery("Item") // here I use some Filter calls, as well as a Limit call and an Order call 
items := make([]datastore.PropertyList, 0) 
_, err := query.GetAll(context, &items) // context has been obviously defined before 
if err != nil { 
    // something to handle the error, which in my case, it's printing it and setting the server status as 500 
} 

更新2:下面是一些輸出

如果我使用make([]datastore.PropertyList, 0),我得到這個:

datastore: invalid entity type 

如果我使用make(datastore.PropertyList, 0),我得到這個:

datastore: cannot load field "Foo" into a "datastore.Property": no such struct field 

而在這兩種情況下(第一個我認爲可以丟棄)在items我得到這樣的:

[] 
+0

你可以分享一些代碼,顯示你目前如何調用'GetAll'? – proppy

+0

當然!稍等一下。 – ArturoVM

+0

@proppy完成了,我用代碼更新了問題。 – ArturoVM

回答

1

按照following post旅途數據存儲模塊不支持對propertyList呢。

改爲使用指向datastore.Map切片的指針。

+0

謝謝,謝謝,謝謝!這確實是問題!這非常簡單,我想方​​設法解決這個問題。 – ArturoVM

+1

還要注意,你需要調用make([] T,n)才能創建一個T,* not * make(T,n)。 – proppy

+2

這個問題在PropertyList實現後發佈,2011年11月SDK 1.6.0。爲了清晰起見(因爲我在搜索中找到了這個答案):GetAll將與* [] PropertyList但不是* PropertyList一起使用。有關詳細信息,請參閱https://developers.google.com/appengine/docs/go/datastore/reference#Query.GetAll。 –