2017-03-25 2 views
2

Ich versuche, eine viele zu viele Beziehung aufzubauen, so habe ich 3 structs:Datastore - Wie wird der Schlüssel in die Struct ID (golang) eingefügt?

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 
} 

Ich glaube, dies ist der richtige Weg, es zu tun, aber mein Problem ist jetzt, dass ich weiß nicht, wie man setzen Sie den Datenspeicher Schlüssel in der Struktur ID ohne zwei client.Put Anfragen zu machen, denn soweit ich das beurteilen kann, datastore.IncompleteKey("Products", nil) nicht den neuen Schlüsselwert bis zurückzukehren, nachdem Sie ihn ..

ich denke, einige Leute empfehlen key *datastore.Key verwenden würde anstelle von ID int64, aber ich würde es vorziehen, den Schlüssel zu einer ID

zu konvertieren

Jede Hilfe wäre sehr willkommen

Antwort

2

Eine Möglichkeit ist, Schlüssel im Voraus zu reservieren, die Sie in Ihren Strukturen vor dem Aufruf Client.Put() setzen können.

Sie können IDs mit der Client.AllocateIDs() zuweisen. Sie können ihm ein Stück unvollständiger Schlüssel übergeben, und Sie erhalten ein Stück kompletter datastore.Key s zurück, das der Datenspeicher für Sie reserviert (und somit garantiert, dass andere nicht "ausgegeben" werden oder beim Speichern von Entitäten mit unvollständigen Schlüsseln verwendet werden). Sie können auf die numerischen IDs der zugewiesenen Schlüssel im Feld Key.ID zugreifen.

Aber das Speichern der numerischen Schlüssel-ID in den Entitäten ist redundant, und ich finde es eine Verschwendung (von Ressourcen). Wann immer Sie eine Entität laden, z. mit Client.Get(), oder multiple mit Client.GetAll(), erhalten Sie auch die Schlüssel zurück, und Sie können die numerischen IDs in den Strukturen "manuell" als Nachbearbeitungsschritt füllen. Sie können diese Nachbearbeitungsfunktion auch in eine Funktion einfügen, die dies für Sie erledigt, wenn Sie Entitäten aus dem Datenspeicher abrufen.

Zum Beispiel, wenn Sie eine OrderDetails Einheit geladen haben, die die OrderID enthält, können Sie verwenden, um die datastore.IDKey()datastore.Key für die jeweilige Order Einheit zu konstruieren. Beispiel tun es:

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) 

Was bedeutet, sollten Sie die „self-ID“ nicht speichern in den Entitäten, können Sie datastore.Key Werte konstruieren, wenn die numerische ID bekannt ist.

Siehe auch damit verbundene Frage: Can I use AllocateIDs as "string" ? datastore

+0

Wow, genau das, was ich brauchte .. vielen Dank <3 .. aber ich bin wirklich neugierig, warum es ist eine Verschwendung, ich meine, in dem obigen Beispiel, wenn Sie das tun Client.GetAll() auf OrderDetails, wie können Sie Bestellungen und Produkte erhalten, wenn Sie keine Bestell-ID und Produkt-ID speichern? – fisker

+0

@fisker Sie können 'datastore.IDKey()' verwenden, um einen 'datastore.Key' aus einer numerischen ID zu erstellen. Siehe bearbeitete Antwort, hinzugefügt ein Beispiel. – icza

+0

Ahh, ich glaube, ich verstehe ... also wenn ich das ID-Feld für Bestellungen und Produkte behalten möchte (um die ID in der Webanwendung anzuzeigen), dann sollte ich 'datastore: '-'' hinzufügen, damit es nicht verschwendet wird Datenspeicher-Ressourcen, und vor dem Zurückgeben der 'var Order Order'-Struktur (nach dem Ausführen von' client.Get (ctx, orderKey, & Order) ') kann ich' order.ID = orderKey.ID' setzen? – fisker