Проекционный запрос GAE python NDB работает в разработке, но не в производстве - PullRequest
0 голосов
/ 05 декабря 2018

Я ударился головой о стену, потому что мой проект Python в Google App Engine имеет очень простой запрос проекции NDB, который отлично работает на моей локальной машине, но таинственным образом завершается неудачей при развертывании в производство.

Добавление к загадке ... в качестве теста я добавил идентичную проекцию для другого свойства, и оно работает как для разработчиков, так и для производства!Кто-нибудь может помочь, пожалуйста ?!Вот более подробная информация:

У меня есть следующая сущность, представляющая расходы:

class Entry(ndb.Model):
    datetime = ndb.DateTimeProperty(indexed=True, required=True)
    amount = ndb.IntegerProperty(indexed=False, required=True)
    payee = ndb.StringProperty(indexed=True, required=True) 
    comment = ndb.StringProperty(indexed=False)
    # ...

Позже в коде я делаю проекцию на Entry.payee (чтобы получить списоквсе получатели).В качестве теста я также добавил проекцию на Entry.datetime:

log_msg = '' # For passing debug info to the browser

payeeObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.payee]).fetch()
payees = []
for obj in payeeObjects:
    payees.append(obj.payee)
log_msg += '%d payees: %s' % (len(payees), str(payees))

log_msg += ' ------------------- ' # a visual separator

dtObjects = Entry.query(ancestor=exp_traq_key(exp_traq_name), projection=[Entry.datetime]).fetch()
dts = []
for obj in dtObjects:
    dts.append(obj.datetime)
log_msg += '%d datetimes: %s' % (len(dts), str(dts))

#...other code, including passing log_msg down to the client

Вот вывод в среде разработчика (обратите внимание, что список получателей и список времени отображаются в консоли):

enter image description here

А вот вывод при развертывании в ядре приложения.Я не могу вернуть список получателей.Он возвращает пустой список, хотя в dev он возвращает список нормально:

enter image description here

Я убедился, что индексы настроены правильноGAE:

enter image description here

Пожалуйста, помогите!


2018-12-05 Обновление : я добавилеще пара записей в производстве, и их забрали!Смотрите скриншот.Но старые записи по-прежнему не возвращаются.enter image description here

Моя немедленная реакция заключается в том, что индекс хранилища данных нужно как-то «обновить», чтобы он мог «видеть» старые записи.НО дело в том, что я вчера удалил и заново создал индекс, а это значит, что в нем должны быть старые записи ... Так что все равно нужна помощь в разгадке этой загадки!

1 Ответ

0 голосов
/ 05 декабря 2018

Я понял это.Черт, это было совсем не интуитивно.Хотелось бы, чтобы документация GAE была лучше в этом вопросе ...

В моем хранилище данных находится много ранее созданных записей.Как часть моего последнего кода, в котором я пытаюсь выполнить проекцию на Entry.payee, мне пришлось изменить определение Entry.payee с неиндексированного на индексированное, например так:

payee = ndb.StringProperty(indexed=True, required=True) # Originally was indexed=False

Так что теперь всете записи, которые находятся в хранилище данных, игнорируются проекционным запросом, потому что индекс получателя игнорирует эти записи.

Итак, мне нужно как-то перенести все эти старые объекты в indexed = True.


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

def runPayeeTypeMigration(exp_traq_name):
  Entry.query(ancestor=exp_traq_key(exp_traq_name)).fetch()
  for entry in entries:
    entry.put()

Это работает, читая все записи в обновленной структуре данных (той, где Entry.payee индексируется = True) и записывает ее обратно в хранилище данных, так что объект будеттеперь будет проиндексирован.

...