В Google App Engine, как мне найти последний заказ для клиента в GQL? - PullRequest
4 голосов
/ 24 мая 2009

Если у меня есть две таблицы, Клиенты и Заказы, и я хочу посмотреть последний заказ для клиента, как бы я сделал это в Google App Engine, используя GQL?

Обычно я присоединяюсь к этим двум таблицам через внешний ключ customer_id, который существует в таблице заказов.

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)

Однако, поскольку в Google App Engine не представляется возможным объединение, я не знаю, как обойти это ограничение. Любые предложения будут оценены.

1 Ответ

10 голосов
/ 24 мая 2009

DataStore в Google App Engine действительно сильно отличается от реляционной базы данных. Есть некоторые сходства, но важно понимать различия при разработке модели данных.

Обычно вы определяете этот тип отношений с помощью справочных свойств:

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

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

ReferenceProperty в определении сущности Order приводит к созданию свойства в сущности Customer с именем 'orders', так что, если 'customer' является экземпляром Customer, вы можете найти все заказы, ссылаясь на 'customer. заказы.

Например:

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

Ссылочные свойства задокументированы здесь.

Другим важным понятием, которое нужно понять, является идея Групп сущностей. Объекты в группах объектов хранятся на одном и том же узле, поэтому их можно хранить и извлекать более эффективно. Они также важны для использования транзакций.

...