Google AppEngine: диапазон дат не возвращает правильные результаты - PullRequest
0 голосов
/ 06 апреля 2009

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

Вот выдержка из кода 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

Я загрузил данные через скрипт de bulkload. Я просто могу думать о поврежденных индексах или о чем-то подобном. Этот же запрос раньше работал для другой таблицы, которая у меня была. Но мне пришлось заменить его новым контентом из другого источника, и этот новый контент не отвечает на запрос таким же образом. Таблица имеет около 700 000 строк, если это имеет какое-либо значение.

Я провел дополнительные исследования и, похоже, это ошибка в AppSignEngine DataStore. Для получения дополнительной информации об ошибке проверьте эту ссылку: http://code.google.com/p/googleappengine/issues/detail?id=901

Я попытался удалить индекс и воссоздать его безуспешно.

спасибо

1 Ответ

1 голос
/ 07 апреля 2009

ничего не выглядит неправильно для меня. Вы уверены, что пропущенные даты также имеют тип 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

Ben

ОБНОВЛЕНИЕ: теперь, когда удаленный API работает и надежен, я редко пишу этот тип обработчиков. Те же идеи применимы и к коду, который вы бы использовали там для перебора объектов в удаленной консоли API.

...