Su Google App Engine, come faccio a cercare l'ultimo ordine per un cliente in GQL?
-
05-09-2019 - |
Domanda
Se ho due tavoli, clienti e ordini, e voglio cercare l'ultimo ordine per un cliente, come dovrei fare questo su Google App Engine utilizzando GQL?
Normalmente, si sarebbe unito queste due tabelle attraverso la chiave esterna, customer_id, che esiste nella tabella degli ordini.
select orders.* from customers, orders
where customers.customer_id = orders.customer_id
and orders.order_id = (select top 1 sub_orders.order_id from orders sub_orders
where sub_orders.customer_id = orders.customer_id
order by sub_orders.order_date desc)
Tuttavia, dal momento che si unisce non sembrano essere possibile su Google App Engine, io non sono sicuro di come aggirare questa limitazione. Ogni suggerimento sarà apprezzato.
Soluzione
Il DataStore in Google App Engine è davvero molto diverso da un database relazionale. Ci sono alcune somiglianze, ma è importante capire le differenze quando si progetta modello di dati.
Il modo in cui si sarebbe normalmente definire questo tipo di relazione è quello di utilizzare le proprietà di riferimento:
class Customer(db.Model):
name = db.StringProperty()
class Order(db.Model):
customer = db.ReferenceProperty( Customer,
collection_name = 'orders' )
Il ReferenceProperty nei risultati definizione di entità ordine nella creazione di una proprietà in entità Customer, denominati 'ordini', in modo che se 'cliente' è un'istanza di Customer, è possibile trovare tutti gli ordini facendo riferimento al 'cliente. ordini'.
Ad esempio:
customer = Customer.gql("WHERE name = :1", "Bob")[0] # Returns the first customer named Bob
order1 = customer.orders[0]
order2 = customer.orders.order("date")[0] # Sorts the Orders by date and gets the first one
Proprietà di riferimento sono documentati qui.
Un altro concetto importante da capire è l'idea di entità gruppi. Entità in un'entità gruppi sono memorizzati sullo stesso nodo, e quindi possono essere memorizzati e recuperati in modo più efficiente. Sono anche fondamentale per l'utilizzo di transazioni.