2017-03-25 11 views
2

は、私は多くの関係に多くを構築しようとしているので、私は3つの構造体持っている:私は、これはそれを行うための正しい方法ですが、私の問題は今、私にはわからないということであると考えていDatastore - Struct ID(golang)内にKeyを挿入するにはどうすればいいですか?

type Orders struct { 
    ID int64 
    CustomerID string 
    etc 
} 

type Products struct { 
    ID int64 
    Name string 
    Description string 
    etc 
} 

type OrderDetails struct { 
    OrderID int64 
    ProductID string 
    Quantity int 
} 

をどのように私の知る限り、datastore.IncompleteKey("Products", nil)は、あなたがそれを置く後まで新しいキー値を返さないので、私は何人かの人々がkey *datastore.Keyを使用することをお勧めします推測.. 2つのclient.Put要求をすることなく

を構造体のID内のデータストアのキーを置きますID int64ではなく、キーをIDに変換することをお勧めします

何か助けていただければ幸いです

答えて

2

1つのオプションは、Client.Put()を呼び出す前に構造体に設定できる事前にキーを割り当てることです。

Client.AllocateIDs()でIDを割り当てることができます。不完全なキーのスライスを渡すことができ、完全なdatastore.Keyのスライスを戻すことができます。これは、データストアがあなたのために予約しています(したがって、不完全なキーを持つエンティティを保存するときに他の人に "あきらめない"ことを保証します)。 Key.IDフィールドに割り当てられたキーの数値IDにアクセスできます。

エンティティに数字のキーIDを格納することは冗長ですが、私はそれをリソースの無駄にしています。たとえばエンティティを読み込むとClient.Get()、またはClient.GetAll()の倍数を使用する場合は、キーを取得して、構造内の数値IDを後処理ステップとして「手動」で入力することもできます。この後処理機能は、データストアからエンティティを取得するたびに、この処理を行う関数でラップすることもできます。例えば

あなたがOrderIDが含まれているロードOrderDetailsエンティティを持っている場合、あなたはそれぞれのOrderエンティティのdatastore.Keyを構築するためにdatastore.IDKey()を使用することができます。それをやっ例:数値のIDがわかっている場合は、エンティティの「自己ID」を格納してはならない意味

var orderDetails OrderDetails 
// Load orderDetails 

orderKey := datastore.IDKey("order", orderDetails.OrderID, nil) 
// Now you have the key for the Order entity 

var order Order 
err := client.Get(ctx, orderKey, &order) 

は、あなたがdatastore.Key値を構築することができます。 3 <どうもありがとう..私は必要なまさに、Can I use AllocateIDs as "string" ? datastore

+0

うわー..しかし、あなたが行う場合、私は、私は上記の例では意味、それは無駄だ理由について、本当に興味:

また、関連の質問を参照OrderDetailsのClient.GetAll()を使用すると、OrderIDとProductIDを格納していない場合、OrderとProductsはどのように取得できますか? – fisker

+0

@fisker数値IDから 'datastore.Key'を構築するのに' datastore.IDKey() 'を使うことができます。編集された答えを見て、例を加えました。 – icza

+0

Ahh、私は理解していると思う..もし私がOrderとProducts(IDをWebアプリケーションに表示する)のIDフィールドを保持したいなら、 'datastore: - ' 'を追加して、 'order.ID = orderKey.ID'を設定することができますか? 'order.ID = orderKey.ID'を設定することはできますか? – fisker

関連する問題