Как присвоить значение по умолчанию всем записям хранилища NDB?

Я должен добавить одно новое свойство в мой существующий класс NDB:

class AppList(ndb.Model): ... ignore = ndb.BooleanProperty(default=False) # new property 

Тогда я буду использовать его, как показано ниже:

 entries = AppList.query() entries = entries.filter(AppList.counter > 5) entries = entries.filter(AppList.ignore == False) entries = entries.fetch() 

Я не могу использовать AppList.ignore != True чтобы поймать ранние добавленные записи (которые не имеют свойства ignore ), поэтому мне нужно назначить False для всех записей в моем AppList . Каков наиболее эффективный способ сделать это? В настоящее время этот объект содержит около 4 000 записей.

Обновление . Я решил использовать следующий уродливый код (не удалось применить cursors ), он работает как задание cron. Но разве я не обновляю все 100 записей каждый раз?

 entities = AppList.query() # entities = entities.filter(AppList.ignore != False) entities = entities.fetch(100) while entities: for entity in entities: entity.ignore = False entity.put() entities = AppList.query() # entities = entities.filter(AppList.ignore != False) entities = entities.fetch(100) 

4 Solutions collect form web for “Как присвоить значение по умолчанию всем записям хранилища NDB?”

Не забывайте, что в этих случаях используется библиотека MapReduce. Но я считаю, что лучший способ – использовать все эти предложения.

Теперь вам нужно получить () и поставить () 4000 объектов, и вопрос заключается в том, как уменьшить «затраты» на эту операцию.

Мне просто интересно узнать, что возвращает ваш bool(entity.ignore) . Если missing свойство возвращает False, вы можете настроить код, считая его False, и отложить операцию. Если вы поместите () по другой причине, ignore свойства записывается в False благодаря аргументу по умолчанию. Итак, для остальных сущностей можно запустить такой скрипт (через remote_api):

 def iter_entities(cursor=None): entries = AppList.query() res, cur, more = entries.fetch_page(100, start_cursor=cursor) put_queue = [ent for ent in res if not hasattr(ent, 'ignore')] # put_queue = [] # for ent in res: # if not hasattr(ent, 'ignore'): # put_queue.append(ent) ndb.put_multi(put_queue) if more: iter_entities(cur) # a taskqueue is better 

Обновленный код обновит только первые 100 объектов. попробуйте использовать курсор

https://developers.google.com/appengine/docs/python/ndb/queries#cursors

если вы не используете курсор, используйте смещение и продолжайте увеличивать смещение на 100 в каждом цикле или извлекаете все записи один раз методом fetch () (подход курсора лучше)

и вместо того, чтобы ставить их один за другим, используйте ndb.put_multi (список объектов для размещения)

это будет быстрее, чем по одному

Вы можете попробовать использовать hasattr для проверки, имеет ли запись свойство ignore.

Если вы просто хотите назначить False для всех записей в объекте AppList, вам просто нужно сделать обновление вашей схемы (перезагрузить файл models.py), а затем вы должны установить свойство False.

Более подробную информацию об обновлении схемы можно найти здесь.

EDIT: ответить на ваш комментарий:

 if hasattr(entity, 'ignore'): #your code goes here 

Простейшим способом без развертывания нового кода будет использование удаленного api и выполнение запроса, получающего все сущности, и установление значения свойства false, а затем put (). 4000 записей не много.

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

  • Разница между Flask и Webapp2 (GAE)
  • GAE Webapp2 - разрушающий сеанс не работает
  • Как вручную разобрать исходящий адрес GAE?
  • Проблемы с производительностью memcache App Engine / ndb.get_multi
  • Django vs webapp2 в App Engine
  • Можем ли мы запустить многопроцессорный пул в GAE?
  • Как установить тайм-аут для urlfetch в Google App Engine?
  • Как подключить Facebook OAuth 2.0 полностью к серверу?
  • Google App Engine (python): TemplateSyntaxError: инструкции «для» с пятью словами должны заканчиваться на «reverse»
  • Обслуживание статического html в Google app engine Python
  • Как обрабатывать удаление в Google App Engine (Python)
  •  
    Interesting Posts for Van-Lav

    Sqlite / SQLAlchemy: как применять внешние ключи?

    Может ли использование `setattr` (и` getattr`) рассматриваться как плохая практика?

    Как я могу заставить setuptools установить пакет, который не находится в PyPI?

    Просмотр PDF-изображения в iPython Notebook

    PyQt. Получать ошибки, пытаясь отделить графический интерфейс от логики

    Python: запускает любой альфа-символ

    Существует ли библиотека для предотвращения повторных представлений формы для django?

    Как ссылаться на модуль верхнего уровня в Python внутри пакета?

    IOError: декодер jpeg недоступен при использовании подушки

    Создание динамического обновленного графика с помощью Python

    Пакетное преобразование .py (текстовые файлы) в .pdf на osx

    Использование exec в файле в другом каталоге вызывает ошибки импорта модуля

    Сохранение Django-formwizard и ModelFormSet

    ошибка: код в pandas числовые разрывы столбцов с ошибкой форматирования строки

    Python не может открыть 11gb csv в режиме r +, но открывается в режиме r

    Python - лучший язык программирования в мире.