Google AppEngine:Диапазон дат не возвращает правильные результаты
-
05-09-2019 - |
Вопрос
Я пытаюсь найти некоторые значения в диапазоне дат для определенного типа, но запрос не возвращает содержимое дат, существующих в базе данных.
Вот выдержка из кода Python:
deltaDays = timedelta(days= 20)
endDate = datetime.date.today()
startDate = endDate - deltaDays
result = db.GqlQuery(
"SELECT * FROM myData WHERE mytype = :1 AND pubdate >= :2 and pubdate <= :3", type, startDate, endDate
)
class myData(db.Model):
mytype = db.StringProperty(required=True)
value = db.FloatProperty(required=True)
pubdate = db.DateTimeProperty(required=True)
GQL возвращает данные, но некоторые ожидаемые строки отсутствуют:
2009-03-18 00:00:00
(missing date in results: 2009-03-20 data exists in database)
2009-03-23 00:00:00
2009-03-24 00:00:00
2009-03-25 00:00:00
2009-03-26 00:00:00
(missing date in results: 2009-03-27 data exists in database)
2009-03-30 00:00:00
(missing date in results: 2009-03-31. data exists in database)
2009-04-01 00:00:00
2009-04-02 00:00:00
2009-04-03 00:00:00
2009-04-06 00:00:00
Я загрузил данные через скрипт массовой загрузки.Я просто могу думать о повреждении индексов или о чем-то подобном.Этот же запрос раньше работал для другой таблицы, которая у меня была.Но мне пришлось заменить его новым контентом из другого источника, и этот новый контент не отвечает на запрос таким же образом.В таблице около 700 000 строк, если это имеет какое-то значение.
Я провел дополнительное исследование и обнаружил, что это ошибка в хранилище данных appEngine.Для получения дополнительной информации об ошибке перейдите по этой ссылке:http://code.google.com/p/googleappengine/issues/detail?id=901
Я пытался удалить индекс и воссоздать его, но безуспешно.
Спасибо
Решение
мне ничего не кажется неправильным.вы уверены, что недостающие даты также имеют тип mytype ==?
Раньше я наблюдал забавное поведение индексов.Я рекомендую написать обработчик для перебора всех ваших записей и просто положить() их обратно в базу данных.возможно, что-то с массовой загрузкой не работает должным образом.
Вот тип обработчика, который я использую для перебора всех объектов в классе модели:
class PPIterator(BaseRequestHandler):
def get(self):
query = Model.gql('ORDER BY __key__')
last_key_str = self.request.get('last')
if last_key_str:
last_key = db.Key(last_key_str)
query = Model.gql('WHERE __key__ > :1 ORDER BY __key__', last_key)
entities = query.fetch(11)
new_last_key_str = None
if len(entities) == 11:
new_last_key_str = str(entities[9].key())
for e in entities:
e.put()
if new_last_key_str:
self.response.out.write(json.write(new_last_key_str))
else:
self.response.out.write(json.write('done'))
Вы можете использовать все, что хотите, для перебора сущностей.Раньше я использовал Javascript в окне браузера, но обнаружил, что это была свинья при выполнении сотен тысяч запросов.Сейчас мне удобнее использовать такой Ruby-скрипт:
require 'net/http'
require 'json'
last=nil
while last != 'done'
url = 'your_url'
path = '/your_path'
path += "?/last=#{last}" if last
last = Net::HTTP.get(url,path)
puts last
end
Бен
ОБНОВЛЯТЬ:теперь, когда удаленный API работает и надежен, я больше редко пишу обработчики такого типа.Те же идеи применимы к коду, который вы будете использовать для перебора объектов в удаленной консоли API.