В Google App Engine, как я мог бы посмотреть последний заказ для клиента в GQL?

StackOverflow https://stackoverflow.com/questions/902516

  •  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

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

Еще одной важной концепцией для понимания является идея групп сущностей.Сущности в группах сущностей хранятся на одном узле, и поэтому их можно хранить и извлекать более эффективно.Они также имеют решающее значение для использования транзакций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top