Question

Im essayant de rechercher certaines valeurs dans une plage de dates pour un type spécifique, mais le contenu pour les dates qui existent dans la base de données ne sont pas retournés par la requête.

Voici un extrait du code 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)

Le GQL renvoie des données, mais quelques lignes que j'attends manquent:

 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

J'ai téléchargé les données via le script de bulkload. Je ne peux penser à des indices étant corrompus ou quelque chose de similaire. Cette même requête utilisée pour travailler pour une autre table que j'avais. Mais je devais le remplacer par le nouveau contenu d'une autre source, et ce nouveau contenu ne répond pas à la requête de la même manière. La table a autour de 700.000 lignes si cela fait une différence.

Je l'ai fait plus de fourmi de recherche, il semble que son un bogue dans le AppEngine DataStore. Pour plus d'informations sur le bug vérifier ce lien: http://code.google.com/p/googleappengine/issues/ détail? id = 901

Je l'ai essayé et droping l'index recréer avec pas de chance.

Merci

Était-ce utile?

La solution

rien ne semble mal à moi. êtes-vous sûr que les dates manquantes ont aussi montype == Type?

J'ai observé un comportement bizarre avec des indices dans le passé. Je vous conseille d'écrire un gestionnaire à itérer tous vos dossiers et juste les mettre () de retour dans la base de données. peut-être quelque chose avec le transfert groupé ne fonctionne pas correctement.

Voici le type de gestionnaire que j'utilise pour itérer toutes les entités dans une classe de modèle:

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

Vous pouvez utiliser ce que vous voulez itérer les entités. Je l'habitude d'utiliser Javascript dans une fenêtre de navigateur, mais a constaté que était un cochon en faisant des centaines de milliers de demandes. Ces jours-ci je trouve plus pratique d'utiliser un script Ruby comme celui-ci:

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

MISE À JOUR: maintenant que api travaille à distance et fiable, j'écris rarement ce type de gestionnaire plus. Les mêmes idées s'appliquent au code que vous utiliseriez là pour itérer les entités dans la console api à distance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top