1

Итак, у меня есть один и тот же код python локально и в облаке gae.Puzzling App Datastore Issue (ListProperty)

, когда я храню объект локально, то ListProperty поле типа набора элементов datetime.datetime выглядит так в Datastore просмотра:

2009-01-01 00:00:00,2010-03-10 00:00:00 

, когда я храню же на облаке, зритель показывает:

[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)] 

Почему разные представления?

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

Кто-нибудь думает о причине, почему это происходит, и о решении?

UPDATE: мой запрос выглядит следующим образом (с помощью фильтров):

from x import y 
from datetime import datetime 
from google.appengine.ext import db 

q = y.EntityType.all().filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now()) 

usersResult = q.fetch(100) 
print `len(usersResult)` 

результат должен быть 1, а это 0.

На самом деле это просто ListProperty с указанным datetime.datetime значением, которое проблема - запросы в StringListProperty работают как ожидается в облаке.

Я попробовал необработанный фильтр через интерактивную консоль как на локальном, так и на облачном, и облако не дает мне никаких результатов. Так что это хранилищу вещь, я предполагаю, что это обязательно иметь что-то делать с форматом хранения - У меня есть только одно значение лица в обоих датасторов с ListProperty выглядит как:

2009-01-01 00:00:00,2010-03-09 00:00:00 
[datetime.datetime(2009, 1, 1, 0, 0), datetime.datetime(2010, 3, 9, 0, 0)] 

на местные и облака соответственно.

Любые идеи?

Дальнейшего Обновление

Заменен DateTime.Now() с закодированной датой-OBJ - пример фильтр теперь похож:

y.EntityType.all().filter('displayDateRange <=',datetime(2009,11,24)).filter('displayDateRange >=',datetime(2009,11,24)) 

Запиской с вышеуказанным диапазоном DateTime ListProperty от 1.1.2009 3,9 .2010 это должно вернуть вышеописанный объект - я пробовал этот идентичный фильтр на сервере localhost dev, и он это сделал. Облако, с его другим представлением datetime.datetime ListProperty, нет.

ПримечаниеЭтот берется из current best practice for filtering on date range

Любые идеи, что может быть не так?

ответ

2

Ok длинный рассказ короткий: теперь он классифицируется как ошибка в версии сервера разработчиков движка приложения и больше не поддерживается в хранилище данных облачных данных.

Заполненная дальнейшее объяснение в blog post, проверить точку 3.

1

Проблема, которую вы видите, - это преобразование в строку (вызов или __unicode__) в локальном случае, в то время как представление (представление) ваших данных отображается в облаке. Но эта разница в распечатке результатов не должна быть причиной вашего неудачного запроса в облаке.

Каков ваш точный запрос?

UPDATE после того, зная запрос:

Я действительно не понимаю, почему вы используете эти условия фильтра:

.filter('displayDateRange <=',datetime.now()).filter('displayDateRange >=',datetime.now()) 

Есть две проблемы:

  • Вы вызываете datetime.now() дважды, что может дать вам разные результаты, что приведет к пустующему набору результатов. Это особенно актуально на загруженном сервере с одновременным одновременным одновременным выполнением нескольких потоков/процессов выполнения.

  • Что вы могли бы сделать с вышеупомянутой парой фильтров, является проверка равенства. Но это не сработает, если точность экземпляра datetime, возвращаемого datetime.now(), и точность времени, хранящегося в базе данных, отличается. Нецелесообразно проверять равенство в случае чисел с плавающей запятой и средних значений времени в секунду.

Что вы хотите достичь с помощью такой пары условий фильтра?

+0

обновляется по мере необходимости – rutherford

+0

Интересно - у вас опыт Google App Engine? Это рекомендуемый шаблон для фильтрации на дату, находящуюся в определенном диапазоне (ListProperty и тест равенства) - источник: http://appengine-cookbook.appspot.com/attachment/?id=ahJhcHBlbmdpbmUtY29va2Jvb2tyEQsSCkF0dGFjaG1lbnQY0ygM – rutherford

+0

хотя я допускаю 2 обращения к дате .now() is shoddy, изменится, что – rutherford