2017-03-08 2 views
0

Ich verwende AppEngine mit der Python-Laufzeitumgebung, um ein Dashboard für mein Team zu hosten. Die Daten für das Dashboard werden in Memcache und/oder Cloud Datastore gespeichert. Neue Daten werden mithilfe der BigQuery-API in die Anwendung gezogen.Zurückgeben aller Entitäten (Daten) aus dem letzten put()

class ExampleForStackOverflow(webapp2.RequestHandler): 

    def get(self): 

     credentials = GoogleCredentials.get_application_default() 
     bigquery_service = build('bigquery', 'v2', credentials=credentials) 

     query = """SELECT field1, field2 
        FROM 
        [table_name];""" 

     try: 
      timeout = 10000 
      num_retries = 5 
      query_request = bigquery_service.jobs() 
      query_data = { 
       'query': (query), 
       'timeoutMs': timeout, 
      } 

      query_response = query_request.query(
       projectId='project_name', 
       body=query_data).execute(num_retries=num_retries) 

      # Insert query response into datastore 
      for row in query_response['rows']: 
       parent_key = ndb.Key(MyModel, 'default') 
       item = MyModel(parent=parent_key) 
       item.field1 = row['f'][0]['v'] 
       item.field2 = row['f'][1]['v'] 

       item.put() 

     except HttpError as err: 
      print('Error: {}'.format(err.content)) 
      raise err 

Diese Abfragen geben eine unbestimmte Anzahl von Datensätzen zurück. Ich möchte, dass das Dashboard die Ergebnisse der Abfragen unabhängig von der Anzahl der Datensätze anzeigt, so dass die Verwendung von order() durch created und die Verwendung von fetch() zum Abrufen einer bestimmten Anzahl von Datensätzen nicht hilfreich ist.

Ist es möglich, eine Abfrage zu schreiben, um alles von der letzten Operation put() zurückzugeben?

Bisher habe ich versucht, alle Datensätze zurück, die innerhalb eines bestimmten Zeitfensters geschrieben wurden (zB How to query all entries from past 6 hours (datetime) in GQL?)

Das ist nicht für mich auf eine zuverlässige Art und Weise funktioniert, weil jeder so oft die cron-Job, der Abfragen denn die neuen Daten werden fehlschlagen, so dass mir ein leeres Diagramm verbleibt, bis der Cron-Job am nächsten Tag ausgeführt wird.

Ich brauche eine belastbare Abfrage, die immer Daten zurückgibt. Danke im Voraus.

Antwort

2

Sie könnten eine zusätzliche DateTimeProperty type-Eigenschaft in MyModel haben, ist es last_put, rufen lassen, die die auto_now Option True gesetzt haben. Das Datum der letzten Aktualisierung einer solchen Entität wird daher in der Eigenschaft last_put erfasst.

In Ihrem get() Methode, die Sie mit einem Vorfahren Abfrage auf die MyModel Entitäten, von last_put und Abrufen von nur einem Artikel sortiert beginnen würde - es wird der zuletzt ein aktualisiert werden.

Der last_put Eigenschaftswert dieser MyModel Einheit gibt das Datum der letzten put() Sie suchen. Welche Sie dann in Ihrer bigquery-Abfrage verwenden können, wie in dem Beitrag erwähnt, auf den Sie verwiesen haben, um die Entitäten seit diesem Datum zu erhalten.

0

Dans Antwort führte mich auf den richtigen Weg, aber ich verwendete eine Variation dessen, was er vorschlug (hauptsächlich, weil ich Ahnenfragen nicht gut verstehe). Ich weiß, dass dies nicht der effizienteste Weg ist, aber das wird jetzt funktionieren. Danke, Dan!

Mein Modell:

class MyModel(ndb.Model): 
    field1 = ndb.StringProperty(indexed=True) 
    field2 = ndb.StringProperty(indexed=True) 
    created = ndb.DateTimeProperty(default=datetime.datetime.now()) 

Meine Frage:

query = MyModel.query().order(-MyModel.created) 
query = query.fetch(1, projection=[MyModel.created]) 
for a in query: 
    time_created = a.created 
query = MyModel.query() 
query = query.filter(MyModel.created == time_created) 
+0

Vorfahr Abfrage ist nur eine Abfrage, in der Sie einen Vorfahren Schlüssel angeben, die in Ihnen Fall ist der gemeinsame übergeordnete Schlüssel: –

+0

'query = MyModel.query (Vorgänger = ndb.Key (MyModel, 'default')). order (-MyModel.created)' –

+0

Danke, Dan! Ich schätze es. – afed

Verwandte Themen