1

私はDatastoreで厄介な問題を抱えていますが、これは回避策がないようです。GolangにGoogle Datastore Kindのプロパティ名をスペースで処理する方法はありますか?

Google Appengine Datastoreパッケージを使用して、投影クエリの結果をAppengineのメモリにプルバックして操作します。これは、各エンティティをStructとして表すことによって達成されています。各Structフィールドはプロパティ名に対応します:

type Row struct { 
Prop1 string 
Prop2 int 
} 

これは素晴らしい機能ですが、スペースを含む他のプロパティ名の読み込みにクエリを拡張しました。クエリが正常に動作しながら、同じ命名規則の構造体に与えられた値を配置するために探しているとして、それが戻って構造体にデータを引っ張ることができない、と私は、この種のエラーになっています:

datastore: cannot load field "Viewed Registration Page" into a "main.Row": no such struct field 

を明らかに、Golangはこのような構造体フィールドを表現することはできません。関連するタイプのフィールドがありますが、そこに配置するようにクエリに指示する明白な方法はありません。

ここで最善の解決策は何ですか?

乾杯

答えて

2

実際に行くには、(:What are the use(s) for tags in Go?詳細については、この答えを参照)タグを使用して、異なる構造体のフィールド名にマッピングするエンティティプロパティ名をサポートしています。例えば

type Row struct { 
    Prop1 string `datastore:"Prop1InDs"` 
    Prop2 int `datastore:"p2"` 
} 

しかしdatastoreパッケージパニックの囲碁実装あなたはスペースが含まれているプロパティ名を使用しようとします。

合計:Goで構造体フィールドにスペースを含むプロパティ名をマップすることはできません(これは将来変更される可能性のある実装の制限です)。

しかし、良い情報は、構造体の値ではなく、これらのエンティティをロードできることです。

datastore.PropertyListの変数にロードすることができます。 datastore.PropertyListは、基本的にdatastore.Propertyのスライスです。ここで、Propertyは、プロパティの名前、その値などの情報を保持する構造体です。

これはそれを行うことができる方法です。

k := datastore.NewKey(ctx, "YourEntityName", "", 1, nil) // Create the key 
e := datastore.PropertyList{} 

if err := datastore.Get(ctx, k, &e); err != nil { 
    panic(err) // Handle error 
} 

// Now e holds your entity, let's list all its properties. 
// PropertyList is a slice, so we can simply "range" over it: 
for _, p := range e { 
    ctx.Infof("Property %q = %q", p.Name, p.Value) 
} 

エンティティが値"the_value"を持つプロパティ"Have space"を持っている場合は、例えば表示されます:あなたはdatastore.PropertyLoadSaverを実装することができ

2016-05-05 18:33:47,372 INFO: Property "Have space" = "the_value" 

注意あなたの構造体に型を入れ、これをフードの下で処理します。したがって、基本的に構造体の値にそのような要素を読み込むことはできますが、これを自分で実装する必要があります。

しかし、エンティティ名とプロパティ名にはスペースを入れないようにしてください。あなたがこれらを許せば、あなたの人生はより困難で悲惨になります。

+1

クール。私の知る限りPropertyList型を持ってくれてありがとう!答えは私の方が優れています。 –

+0

それは私に必要なものを私に与えなかったとしても、それはひどい答えです。私は実際にあなたが私のアプリで99%そこにいるので、このケースでは私の構造体に示唆していることを実際に行うことがあります、そして、今、あきらめるのは残念です:)乾杯! – csmallon

+0

@csmallon私は答えが受け入れられたとマークされるべきだと思います。 –

0

私は定数/変数名の末尾としてスペースを扱う知っているすべてのプログラミング言語。明白な解決策は、プロパティ名にスペースを使用しないようにすることです。

また、プロパティ名はすべてのエンティティとすべてのインデックスエントリの一部になります。私はGoogleがどうにかそれらを圧縮するかどうか分からないが、いずれにしても短いプロパティ名を使う傾向がある。

+0

残念ながら、それは私が使用しているデータセットを作成していないので、それは賢明な解決策ではありません。 プロパティ名 - >構造体フィールドから何らかのマッピングを定義することが可能かどうかを知ることは理想的ですが、GAE Datastore APIではこのようなことはないようです。 – csmallon

+0

マッピング+インデックス設定があります。私の答えを見てください。 –

0

アノテーションを使用してプロパティの名前を変更することができます。 docsから

// A and B are renamed to a and b. 
// A, C and J are not indexed. 
// D's tag is equivalent to having no tag at all (E). 
// I is ignored entirely by the datastore. 
// J has tag information for both the datastore and json packages. 
type TaggedStruct struct { 
    A int `datastore:"a,noindex"` 
    B int `datastore:"b"` 
    C int `datastore:",noindex"` 
    D int `datastore:""` 
    E int 
    I int `datastore:"-"` 
    J int `datastore:",noindex" json:"j"` 
} 
関連する問題