Pergunta

Estou tentando procurar alguns valores dentro de um intervalo de datas para um tipo específico, mas o conteúdo para as datas que existem no banco de dados não estão sendo devolvidos pela consulta.

Eis um trecho do código 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)

Os dados retorna GQL, mas algumas linhas que eu estou esperando estão faltando:

 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

I carregado os dados via script de bulkload. Eu só posso pensar dos índices serem corrompidos ou algo similar. Esta mesma consulta usado para o trabalho para outra mesa que eu tinha. Mas eu tive que substituí-lo por um novo conteúdo de outra fonte, e este novo conteúdo não está a responder à consulta da mesma forma. A tabela tem cerca de 700.000 linhas, se isso faz alguma diferença.

Eu tenho feito mais formiga pesquisa parece que é um bug no AppEngine DataStore. Para mais informações sobre o bug verificar este link: http://code.google.com/p/googleappengine/issues/ detalhe? id = 901

Eu tentei droping o índice e recriá-lo sem sorte.

graças

Foi útil?

Solução

nada parece errado para mim. você tem certeza de que as datas ausentes também têm mytype == tipo?

i ter observado um comportamento engraçado com índices no passado. Eu recomendo escrever um manipulador para percorrer todos os seus registros e basta colocar ()-los de volta no banco de dados. talvez algo com o carregamento em massa não está funcionando corretamente.

Aqui está o tipo de manipulador eu uso para percorrer todas as entidades em uma classe de modelo:

 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'))

Você pode usar o que quiser para percorrer as entidades. Eu costumava usar o Javascript em uma janela do navegador, mas descobriu que era um porco ao fazer centenas de milhares de pedidos. Esses dias eu achar que é mais conveniente usar um script ruby ??como esta:

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

UPDATE: agora que api remota está trabalhando e confiável, eu raramente escrever este tipo de manipulador mais. As mesmas idéias se aplicam ao código que você usaria lá para percorrer as entidades na consola da API remoto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top