GqlQuery по ID всегда возвращает результат None

Мой код предназначен для:

  • Получить user_id из файла cookie, если он существует.
  • Запросите хранилище данных, используя user_id для получения пользовательской записи.
  • Наконец, если запись найдена, отображается приветственное сообщение. (регистрация передается в шаблон)

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

Что я делаю не так с этим запросом? GQL обрабатывает идентификаторы в выражениях where неинтуитивно?

#Get  cookie        
user_id = self.request.cookies.get("user_id", 0)

#Query Datastore for matching user_id
user = db.GqlQuery("SELECT * FROM User WHERE id = %s" % user_id).get()  

#If a user is found, display the username
if user.username:
    signup = "Welcome, %s" % user.username

1 ответ

Решение

Хранилище данных имеет свойство Key, которое состоит из (необязательно) предков, типа и имени или идентификатора. Тем не менее, нет конкретного свойства идентификатора. (Ссылка)

Чтобы получить сущность с определенным ключом, ваш код должен выглядеть примерно так:

# Get cookie        
user_id = self.request.cookies.get("user_id", 0)

if not user_id:
  # handle this case, otherwise the call to from_path will fail.

# Build key
user_key = db.Key.from_path('User', long(user_id))

# Get the entity
user = db.get(user_key)

# If a user is found, display the username
if user.username:
    signup = "Welcome, %s" % user.username

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

Когда вы запрашиваете ключи, вы должны указать весь ключ (а не только идентификатор):

user = db.GqlQuery("SELECT * FROM User WHERE __key__ > KEY('User', %s)" % user_id).get()

Заметьте, что здесь я использую неравенство, поскольку использование фильтра равенства для ключа не имеет смысла, учитывая, что вы можете выполнить прямой поиск. Вот ссылка на использование KEY в строке GQL, и я процитировал соответствующий раздел ниже:

Правая часть сравнения может быть одной из следующих (в зависимости от типа данных свойства):

  • литерал ключа сущности, со строковым ключом или полным путем видов и имен / идентификаторов ключей:

    • KEY('encoded key')

    • KEY('kind', 'name'/ID [, 'kind', 'name'/ID...])

Другие вопросы по тегам