Pregunta

Estoy intentando buscar algunos valores dentro de un rango de fechas para un tipo específico, pero la consulta no devuelve el contenido de las fechas que existen en la base de datos.

Aquí hay un extracto del 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)

El GQL devuelve datos, pero faltan algunas filas que esperaba:

 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

Subí los datos a través del script de carga masiva.Simplemente puedo pensar en que los índices estén dañados o algo similar.Esta misma consulta solía funcionar para otra tabla que tenía.Pero tuve que reemplazarlo con contenido nuevo de otra fuente, y este contenido nuevo no responde a la consulta de la misma manera.La tabla tiene alrededor de 700.000 filas, si eso hace alguna diferencia.

He investigado más y parece que es un error en appEngine DataStore.Para obtener más información sobre el error, consulte este enlace:http://code.google.com/p/googleappengine/issues/detail?id=901

Intenté eliminar el índice y recrearlo sin suerte.

gracias

¿Fue útil?

Solución

nada me parece mal.¿Estás seguro de que las fechas que faltan también tienen el tipo mytype ==?

He observado algunos comportamientos extraños con los índices en el pasado.Recomiendo escribir un controlador para recorrer todos sus registros y simplemente volver a colocarlos() en la base de datos.tal vez algo con el cargador masivo no esté funcionando correctamente.

Este es el tipo de controlador que uso para recorrer todas las entidades en una clase 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'))

Puedes usar lo que quieras para iterar a través de las entidades.Solía ​​​​usar Javascript en una ventana del navegador, pero descubrí que era un cerdo al realizar cientos de miles de solicitudes.Hoy en día me resulta más conveniente utilizar un script Ruby como este:

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

ACTUALIZAR:Ahora que la API remota funciona y es confiable, ya rara vez escribo este tipo de controlador.Las mismas ideas se aplican al código que usarías allí para recorrer las entidades en la consola API remota.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top