Pregunta

Si tengo dos mesas, clientes y pedidos, y quiero buscar el último pedido de un cliente, ¿cómo voy a hacer esto en Google App Engine mediante GQL?

Normalmente, se uniría a estas dos tablas a través de la clave externa, customer_id, que existe en la tabla de pedidos.

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)

Sin embargo, ya que se une no parecen ser posible en Google App Engine, no estoy seguro de cómo evitar esta limitación. se agradecería cualquier sugerencia.

¿Fue útil?

Solución

El almacén de datos de Google App Engine es realmente muy diferente de una base de datos relacional. Hay algunas similitudes, pero es importante entender las diferencias cuando se diseña el modelo de datos.

La forma en que normalmente definir este tipo de relación es mediante el uso de propiedades de referencia:

class Customer(db.Model):
    name = db.StringProperty()

class Order(db.Model):
   customer = db.ReferenceProperty( Customer,
                                    collection_name = 'orders' )

El ReferenceProperty en la entidad Solicitar definición resulta en la creación de una propiedad en la entidad cliente, el nombre 'órdenes', de modo que si 'cliente' es una instancia de cliente, se pueden encontrar todos los órdenes, haciendo referencia a 'cliente. pedidos'.

Por ejemplo:

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

Referencia de las propiedades están documentados aquí.

Otro concepto importante a entender es la idea de la Entidad Grupos. Entidades en un grupos de entidades se almacenan en el mismo nodo, y por lo tanto pueden ser almacenados y recuperados de manera más eficiente. También son cruciales para el uso de transacciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top