Неожиданные пустые результаты запроса GQL

Удивительно, но после множества запросов без проблем. Я столкнулся с первой странной проблемой GQL.

Ниже приведены свойства модели под названием Feedback:

content  date    title   type    votes_count     written_by

и следующие настройки настроены в index.yaml:

- kind: Feedback
  properties:
  - name: type
  - name: date
   direction: desc

Когда я запросил все данные обратной связи, отсортированные по дате, он вернул мне все результаты:

query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")

Свойство type хранится в type = db.IntegerProperty (по умолчанию = 1, required = False, indexed = True), и есть 8 строк данных Feedback с типом целого числа 1.

Однако когда я спросил:

query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type)

Он возвращал мне пустые результаты. Что пошло не так?

Обновить

def get_keys_by_feedback_type(type_type):
    if type_type == FeedbackCode.ALL:
        query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")
    else:
        query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type_type)    
    return query

results = Feedback.get_keys_by_feedback_type(int(feedback_type_filter))
for feedback_key in results:
# iterate the query results

Индекс обслуживает:

Feedback 
type ▲ , date ▼ Serving

person MrCooL    schedule 17.05.2012    source источник
comment
Попробуйте использовать что-нибудь кроме type в качестве имени переменной; это функция, предоставляемая Python, и хотя ничто не мешает вам изменить ее на что-то другое (Python очень динамичен), вам действительно следует избегать этого любой ценой.   -  person Adam Crossland    schedule 17.05.2012
comment
Кроме того, возвращает ли запрос результаты, если вы явно используете число 1 вместо переменной?   -  person Adam Crossland    schedule 17.05.2012
comment
ха-ха .. После того, как вы попросили меня изменить переменную 'type', я попытался явно, указав 1 в качестве запроса, но все равно возвращал мне пустые результаты при выполнении return query.count (limit = 1) Какие-либо другие предложения? Возможно, я попытался развернуть еще раз, чтобы дважды подтвердить   -  person MrCooL    schedule 17.05.2012
comment
Вот что я еще пробовал. Я запросил свойства voted_count и type, и оба они также вернули мне пустые результаты. Я действительно не понимаю, что пошло не так. :(   -  person MrCooL    schedule 17.05.2012
comment
Вы уверены, что в вашем хранилище данных все еще есть данные? С сервером разработки локальное хранилище данных может воссоздаваться пустым каждый раз при запуске.   -  person Adam Crossland    schedule 17.05.2012
comment
Я действительно тестировал его через appspot.com. Я развернул его прямо в App Engine. И я уверен, что данные там, потому что, когда я извлек все данные без условий, он показывает все данные, а их было 8 с типом = 1   -  person MrCooL    schedule 17.05.2012
comment
Возможно, вам придется показать больше кода для GqlQuery. Некоторая важная информация отсутствует.   -  person Adam Crossland    schedule 17.05.2012
comment
Я обновил больше. Это примерно то же самое, что я опубликовал изначально.   -  person MrCooL    schedule 17.05.2012
comment
Попробуйте следующее: query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", int(type_type)) если type_type не целое число, вы не получите ожидаемых результатов.   -  person Adam Crossland    schedule 17.05.2012
comment
Я думал об этом, и раньше type_type, передаваемый как параметр, действительно не был целым числом. А затем я преобразовал его, когда передал его как параметр. В любом случае, чтобы получить двойное подтверждение, я все же попробовал ваше предложение, но оно все равно не сработало. Помните, раньше я даже пытался явно поставить 1, чтобы заменить type_type? Даже это не сработало. Вот почему я сейчас ничего не понимаю. :(   -  person MrCooL    schedule 17.05.2012
comment
У меня нет идей, @MrCooL. Прости.   -  person Adam Crossland    schedule 17.05.2012
comment
Я вижу, что вы построили довольно много проектов. Мой GQL определенно правильный, не так ли? Прискорбно отлаживать то, что кажется таким правильным. Индекс обслуживается, синтаксис правильный, параметр целочисленный. :(   -  person MrCooL    schedule 17.05.2012
comment
Ваш GQL, безусловно, кажется мне правильным; хотя лично я всегда использую интерфейс Query.   -  person Adam Crossland    schedule 17.05.2012
comment
Что произойдет, если вы попробуете его на странице администратора хранилища данных в консоли администратора?   -  person Nick Johnson    schedule 18.05.2012
comment
@NickJohnson, я понял, что нам нужно запрашивать его немного иначе, чем в консоли администратора, не могли бы вы привести мне пример, как запросить его из консоли администратора? как изменить синтаксис, который я использую в настоящее время?   -  person MrCooL    schedule 18.05.2012
comment
Всем привет, спасибо за вашу помощь и предложения. Я очень ценил это, особенно @AdamCrossland. Я нашел решение и поделился им в качестве ответа. Спасибо !   -  person MrCooL    schedule 18.05.2012


Ответы (1)


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

Основная причина этого заключалась в том, что я недостаточно хорошо разбирался в индексах App Engine. Раньше свойство type было деиндексировано, потому что я не планировал фильтровать его до недавних изменений требований.

Следовательно, я проиндексировал свойство «тип» из модели определения свойства, как показано в вопросе. Однако свойство 'type' осталось неиндексированным по причине, объясненной из этого: Индексирование ранее не проиндексированных свойств:

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

Итак, решение было бы таким:

Чтобы проиндексировать ранее не проиндексированное свойство

  1. Установите indexed = True в конструкторе свойств:

    class Person(db.Model):
        name = db.StringProperty()
        age = db.IntegerProperty(indexed=True)
    
  2. Получить каждую запись.

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

Итак, с моим GQL все, начиная с вопроса, не было ничего плохого. Все потому, что свойство type осталось неиндексированным. В любом случае, все еще большое спасибо @Adam Crossland за некоторые идеи и предложения.

person MrCooL    schedule 18.05.2012