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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top