В Google App Engine, как я мог бы посмотреть последний заказ для клиента в GQL?
-
05-09-2019 - |
Вопрос
Если у меня есть две таблицы, Customers и Orders, и я хочу посмотреть последний заказ для клиента, как мне сделать это в Google App Engine с использованием GQL?
Обычно я бы объединил эти две таблицы с помощью внешнего ключа customer_id, который существует в таблице orders.
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, я не уверен, как обойти это ограничение.Будем признательны за любые предложения.
Решение
Хранилище данных в 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.orders'.
Например:
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
Ссылочные свойства документированы вот.
Еще одной важной концепцией для понимания является идея групп сущностей.Сущности в группах сущностей хранятся на одном узле, и поэтому их можно хранить и извлекать более эффективно.Они также имеют решающее значение для использования транзакций.