2017-03-08 35 views
0

我正在使用AppEngine和Python运行时环境为我的团队托管一个仪表板。仪表板的数据存储在Memcache和/或Cloud Datastore中。使用BigQuery API将新数据拉入应用程序。返回来自最近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 

这些查询将返回不确定数量的记录。我希望仪表板显示查询的结果,而不管记录的数量是多少,所以使用order()方法创建,然后使用fetch()来拉取一定数量的记录也无济于事。

是否可以编写一个查询以返回最后put()操作的所有内容?

到目前为止,我已经试图返回已写入一定的时间窗口内的所有记录(例如How to query all entries from past 6 hours (datetime) in GQL?

,是不是在一个可靠的方式为我工作,因为每隔一段时间cron作业的查询因为新数据将失败,所以我留下一张空白图,直到第二天执行cron作业。

我需要一个永远不会返回数据的弹性查询。提前致谢。

回答

2

你可以有一个额外的DateTimeProperty型财产MyModel,姑且称之为last_put,这将有auto_now选项设置为True。因此,此实体的最近更新的日期时间将在其last_put属性中捕获。

在你get()方法你会开始对MyModel实体祖先查询,通过last_put排序,获取只有一个项目 - 这将是最近更新的。

last_putMyModel实体的属性值将给出您正在寻找的最后一个put()的日期时间。然后,您可以在您的bigquery查询中使用,就像您引用的帖子中提到的一样,可以在该日期时间之后获取实体。

0

丹的回答让我走上了正确的道路,但我使用了他所建议的变体(主要是因为我对祖先查询没有很好的理解)。我知道这不是实现这一目标的最有效的方式,但它现在可以工作。谢谢,丹!

我的模型:

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

我的查询:

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

祖先查询只是在其中可以指定一个祖先的关键,它在你的情况下,是共同的父键查询: –

+0

'query = MyModel.query(ancestor = ndb.Key(MyModel,'default'))。order(-MyModel.created)' –

+0

谢谢,丹!我很感激。 – afed

相关问题