AppEngine: запрашивает в хранилище данных записи со значением ‹missing›

Я создал новое свойство для своей модели db в хранилище данных Google App Engine.

Старый:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()

Новый:

class Logo(db.Model):
  name = db.StringProperty()
  image = db.BlobProperty()
  is_approved = db.BooleanProperty(default=False)

Как запросить записи логотипа, для которых не установлено значение is_approved? Я пытался

logos.filter("is_approved = ", None)

но это не сработало. В средстве просмотра данных новые значения полей отображаются как.


person Federico Elles    schedule 28.02.2009    source источник


Ответы (3)


Согласно документации App Engine по запросам и индексам, существует различие между сущностями, у которых нет значения свойства, и теми, которые имеют для него значение null; и «Сущности без отфильтрованного свойства никогда не возвращаются запросом». Таким образом, невозможно написать запрос для этих старых записей.

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

person maxg    schedule 01.03.2009
comment
Марция из Google подтвердила, что нет возможности запросить пропущенные значения. - person gravitation; 01.03.2009

Возможно, это изменилось, но я могу фильтровать записи на основе полей null.

Когда я пытаюсь выполнить запрос GQL SELECT * FROM Contact WHERE demo=NULL, он возвращает только записи, для которых отсутствует демонстрационное поле.

Согласно документу http://code.google.com/appengine/docs/python/datastore/gqlreference.html:

Правая часть сравнения может быть одной из следующих (в зависимости от типа данных свойства): [...] логический литерал, как ИСТИНА или ЛОЖЬ; литерал NULL, который представляет нулевое значение (нет в Python).

Я не уверен, что "null" то же самое, что "отсутствует", хотя: в моем случае эти поля уже существовали в моей модели, но не были заполнены при создании. Может быть, Федерико, вы могли бы сообщить нам, работает ли запрос NULL в вашем конкретном случае?

person Louis LC    schedule 22.12.2011
comment
Поле не пропало, если оно было частью вашей модели на момент создания объекта. И он был заполнен при создании, даже если он был заполнен None или пустой строкой. - person Wooble; 22.12.2011
comment
Null имеет значение NULL,! = Отсутствует. На самом деле это занимает место как в хранилище данных, так и в индексах! - person ZiglioUK; 04.11.2014

Практика, которая помогает нам, - это назначать поле версии для каждого вида. Эта версия изначально устанавливается для каждой записи на 1. Если возникает такая необходимость (для заполнения нового или существующего поля в большом наборе данных), поле версии позволяет перебирать все записи, содержащие version = 1. Путем итерации, установка нулевого или другого начального значения для нового поля, увеличение версии до 2, сохранение записи, позволяет заполнить новое или существующее поле значением по умолчанию.

Преимущество поля версии состоит в том, что в процессе выбора можно продолжать выбор по этому более низкому номеру версии (изначально установленному на 1) в течение такого количества сеансов или столько времени, сколько потребуется, пока ВСЕ записи не будут обновлены с новым значением поля по умолчанию.

person Craig D    schedule 20.03.2021