返回最近的put()

时间:2017-03-08 00:52:25

标签: python google-app-engine google-bigquery

我正在使用AppEngine和Python运行时环境为我的团队托管仪表板。仪表板的数据存储在Memcache和/或Cloud Datastore中。使用BigQuery API将新数据提取到应用程序中。

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 个答案:

答案 0 :(得分:2)

您可以在MyModel中添加一个DateTimeProperty类型的属性,让我们将其称为last_putauto_now选项设置为{{1} }}。因此,此类实体的最新更新的日期时间将在其True属性中捕获。

last_put方法中,您从get()实体上的祖先查询开始,按MyModel排序并仅获取一个项目 - 它将是最近更新的一。

last_put实体的last_put属性值将给出您最后寻找的MyModel的日期时间。然后,您可以在bigquery查询中使用,如您引用的帖子中所述,从该日期时间开始获取实体。

答案 1 :(得分: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)