2009-04-06 5 views
0

Ich versuche, nach Werten innerhalb eines Datumsbereichs für einen bestimmten Typ zu suchen, aber Inhalt für in der Datenbank vorhandene Daten wird von der Abfrage nicht zurückgegeben. HierGoogle AppEngine: Datumsbereich gibt keine korrekten Ergebnisse zurück

ist ein Extrakt aus der 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 Daten zurückgibt, 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 die Daten über de bulkload Skript hochgeladen . Ich kann nur daran denken, dass die Indizes beschädigt oder ähnlich sind. Die gleiche Abfrage wurde für eine andere Tabelle verwendet. Aber ich musste es durch neuen Inhalt aus einer anderen Quelle ersetzen, und dieser neue Inhalt antwortet nicht auf die gleiche Weise auf die Anfrage. Die Tabelle hat ungefähr 700.000 Zeilen, wenn das einen Unterschied macht.

Ich habe mehr Forschung getan und es scheint, dass es ein Fehler im appEngine DataStore ist. 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 zu löschen und es ohne Glück neu zu erstellen.

danke

Antwort

1

nichts sieht mir schief. Sind Sie sicher, dass die fehlenden Daten auch mytype == type haben?

Ich habe einige lustige Verhalten mit Indizes in der Vergangenheit beobachtet. Ich empfehle, einen Handler zu schreiben, um alle Ihre Datensätze zu durchlaufen und sie einfach in die Datenbank zu setzen. vielleicht funktioniert etwas mit dem Bulk-Uploader nicht richtig.

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

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, was Sie durch die Entitäten iterieren wollen verwenden. Ich benutzte Javascript in einem Browserfenster, fand aber heraus, dass es ein Schwein war, wenn ich Hunderttausende von Anfragen machte. 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 verwenden, um die Entitäten in der Remote-API-Konsole zu durchlaufen.

+0

Ja, die vorhandenen Daten haben den gleichen Typ wie in der Abfrage. Ich habe es getestet, während ich die Ergebnisse in das Protokoll geschrieben habe, und es ist korrekt. –

+0

Ich habe die Frage mit weiteren Informationen aktualisiert. –

+0

Fantastisches Skript, ich werde es heute Abend versuchen. Hast du den HTML-Code, der den new_last_key_str aus dem JSON holt und ihn für eine Aktualisierung in die URL zurücksetzt? –