запрос ndb на облачной платформе Google периодически ничего не возвращает - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть приложение Python, развернутое на Google Cloud Platform. На заднем плане находится хранилище данных Google Cloud с двумя типами. Я использую NDB для извлечения данных в приложение.

class AttEvent(ndb.Model):
  event = ndb.StringProperty()
  matchdate = ndb.DateTimeProperty()

class MainPage(webapp2.RequestHandler):

  def get(self):

    query = AttEvent.query().order(AttEvent.matchdate)
    for q in query.fetch():
        try:
          # application code

Один из видов (AtEvent в коде выше) доставляет мне неприятности. Приложение будет развернуто и работать как положено в течение нескольких часов / дней, но затем периодически прекращает возвращать данные. Отладка показывает, что объект q является допустимым объектом типа AttEvent, но для каждого из элементов в коллекции values ​​ он говорит: «(У объекта нет полей)». Когда код приложения пытается сослаться на свойство модели (например, q.event), происходит сбой.

Запрос неожиданно начнет работать снова, минуты / часы спустя, даже если я не буду предпринимать никаких действий. Я не вижу никакой картины или видимой причины. Очевидно, что это не идеально с точки зрения пользователя.

Вид, вызывающий проблемы, - это статические данные, которые на самом деле содержат только 3 объекта. Другой тип является транзакционным, содержит тысячи записей, но никогда не проявлял такого же поведения.

Прерывистый характер ошибки заставляет меня верить, что это как-то связано с кэшированием, но я довольно плохо знаком с Python и GCP, поэтому не совсем уверен. Я пытался сделать context.clear_cache () перед запросом, но это не имеет никакого эффекта.

Я что-то упускаю из виду?

1 Ответ

0 голосов
/ 08 сентября 2018

Я не знаю, почему это происходит, но у меня есть возможность обойти это. Поскольку данные статичны, а объекты кажутся небольшими, вы можете хранить их в памяти экземпляров, а не запрашивать их каждый раз, когда они вам нужны.

Сохранение сущностей в переменной уровня модуля, например:

att_entities = AttEvent.query().order(AttEvent.matchdate).fetch()

class AttEvent(ndb.Model):
  event = ndb.StringProperty()
  matchdate = ndb.DateTimeProperty()

class MainPage(webapp2.RequestHandler):

  def get(self):
    for q in att_entities:
        try:
          # application code

Вы получите объекты только при запуске нового экземпляра, если он работает в первый раз, когда вы все настроили. В качестве бонуса, вызов get будет выполняться быстрее, поскольку вам не нужно извлекать данные из хранилища данных.

Возможно, вам придется добавить дополнительную логику, чтобы att_entities обновлялся по мере необходимости.

...