Motor de aplicaciones de Google:El intervalo de fechas no arroja resultados correctos
-
05-09-2019 - |
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
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.