Domanda

Sto cercando di cercare alcuni valori all'interno di un intervallo di date per un tipo specifico, ma il contenuto delle date esistenti nel database non viene restituito dalla query.

Ecco un estratto del codice 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)

Il GQL restituisce i dati, ma mancano alcune righe che mi aspetto:

 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

Ho caricato i dati tramite lo script bulkload.Posso solo pensare che gli indici siano danneggiati o qualcosa di simile.Questa stessa query funzionava per un'altra tabella che avevo.Ma ho dovuto sostituirlo con nuovi contenuti provenienti da un'altra fonte e questi nuovi contenuti non rispondono alla query nello stesso modo.La tabella ha circa 700.000 righe se questo fa qualche differenza.

Ho fatto più ricerche e sembra che si tratti di un bug nell'appEngine DataStore.Per ulteriori informazioni sul bug controlla questo link:http://code.google.com/p/googleappengine/issues/detail?id=901

Ho provato a eliminare l'indice e a ricrearlo senza fortuna.

Grazie

È stato utile?

Soluzione

niente mi sembra sbagliato.sei sicuro che anche le date mancanti abbiano mytype == type?

ho osservato alcuni comportamenti strani con gli indici in passato.Consiglio di scrivere un gestore per scorrere tutti i tuoi record e semplicemente inserirli nuovamente nel database.forse qualcosa con l'uploader collettivo non funziona correttamente.

Ecco il tipo di gestore che utilizzo per scorrere tutte le entità in una classe del modello:

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

Puoi usare quello che vuoi per scorrere le entità.Usavo Javascript in una finestra del browser, ma ho scoperto che era un maiale quando facevo centinaia di migliaia di richieste.Al giorno d'oggi trovo più conveniente usare uno script Ruby come questo:

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

AGGIORNAMENTO:ora che l'API remota funziona e è affidabile, raramente scrivo più questo tipo di gestore.Le stesse idee si applicano al codice che utilizzeresti lì per scorrere le entità nella console API remota.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top