我正在使用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作业在第二天运行。
我需要一个始终返回数据的弹性查询。提前谢谢。
答案 0 :(得分:2)
您可以在MyModel
中添加一个DateTimeProperty
类型的属性,让我们将其称为last_put
,auto_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)