Frage

Im Versuch für einige Werte in einem bestimmten Zeitraum für eine bestimmte Art zu suchen, aber Inhalte für Termine, die in der Datenbank vorhanden sind, die von der Abfrage nicht zurückgegeben werden.

Hier ist ein Auszug aus dem Python-Code:

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)

Die GQL liefert Daten, aber einige Zeilen, die ich erwarte fehlen:

 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

Ich hochgeladen die Daten über de bulkload Skript. Ich kann nur denken, der Indizes ähnlich beschädigt oder etwas zu werden. Die gleiche Abfrage verwendet hatte ich für einen anderen Tisch zu arbeiten. Aber ich hatte es mit neuen Inhalten aus einer anderen Quelle zu ersetzen, und diese neuen Inhalte nicht auf die gleiche Art und Weise auf die Anfrage reagiert. Die Tabelle hat rund 700.000 Zeilen, wenn das einen Unterschied macht.

Ich habe mehr Forschung ant getan scheint es, dass sein ein Fehler in der App Engine Datastor. Für weitere Informationen über den Fehler überprüfen Sie diesen Link: http://code.google.com/p/googleappengine/issues/ Detail? id = 901

Ich habe versucht, den Index Droping und es ohne Glück neu zu erstellen.

Dank

War es hilfreich?

Lösung

nichts scheint mir falsch. auch mytype haben, sind Sie sicher, dass die fehlenden Daten == Typ?

Ich habe einige lustige Verhalten mit Indizes in der Vergangenheit beobachtet. Ich empfehle einen Handler Schreiben durch alle Ihre Aufzeichnungen zu wiederholen und sie einfach zurück in die Datenbank aufgenommen (). vielleicht etwas mit den Bulk-Uploader nicht richtig funktioniert.

Hier ist die Art von Handler ich durch alle Instanzen in einem Modellklasse iterieren:

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

Sie können mit, was Sie durch die Entitäten laufen wollen. Ich verwendete Javascript in einem Browser-Fenster zu verwenden, aber festgestellt, dass ein Schwein war, als Hunderttausende von Anfragen. In diesen Tagen finde ich es bequemer, ein Ruby-Skript wie diese zu verwenden:

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: jetzt, dass Remote-api arbeitet und zuverlässig, ich selten diese Art von Handler mehr schreiben. Die gleichen Ideen gelten für den Code, den Sie dort durch die Entitäten in der Remote-Konsole api iterieren verwenden würden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top