Хобрук: Ваш путь к мастерству в программировании

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, которое состоит из (необязательно ) предки, вид и имя или идентификатор. Однако конкретного свойства id нет. (ссылка)

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

# 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, и я ve процитировал соответствующий раздел ниже:

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

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

    • KEY('encoded key')

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

05.10.2013
  • Итак, ранее я получил это несколько работающим, используя метод get_by_id user = User.get_by_id(int(user_id)) но столкнулся с ошибкой, когда файл cookie не существует. Ваш код также выдает эту же ошибку. Это связано со значением по умолчанию, которое я использую, когда файл cookie user_id не существует user_id = self.request.cookies.get(user_id, 0). Оказывается, метод from_path() не принимает 0 для аргумента id_or_name. Из документации Google App Engine: идентификатор, указанный как строка или длинный. Это не может быть число 0. 08.10.2013
  • Ах, да, вы совершенно правы - отсутствующий файл cookie сломает его. Я продолжу и отредактирую код, чтобы другие люди не столкнулись с той же проблемой. 09.10.2013
  • Новые материалы

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...