Google 数据存储中的 get() 未按预期工作
get() in Google Datastore doesn't work as intended
我正在根据 Steve Hoffman 在 Udacity 上的 Web 开发课程构建一个基本博客。这是我的代码 -
import os
import webapp2
import jinja2
from google.appengine.ext import db
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape = True)
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)
jinja_env.filters['datetimeformat'] = datetimeformat
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
class Entries(db.Model):
title = db.StringProperty(required = True)
body = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
class MainPage(webapp2.RequestHandler):
def get(self):
entries = db.GqlQuery('select * from Entries order by created desc limit 10')
self.response.write(render_str('mainpage.html', entries=entries))
class NewPost(webapp2.RequestHandler):
def get(self):
self.response.write(render_str('newpost.html', error=""))
def post(self):
title = self.request.get('title')
body = self.request.get('body')
if title and body:
e = Entries(title=title, body=body)
length = db.GqlQuery('select * from Entries order by created desc').count()
e.put()
self.redirect('/newpost/' + str(length+1))
else:
self.response.write(render_str('newpost.html', error="Please type in a title and some content"))
class Permalink(webapp2.RequestHandler):
def get(self, id):
e = db.GqlQuery('select * from Entries order by created desc').get()
self.response.write(render_str('permalink.html', id=id, entry = e))
app = webapp2.WSGIApplication([('/', MainPage),
('/newpost', NewPost),
('/newpost/(\d+)', Permalink)
], debug=True)
在 class Permalink
中,我使用 get()
方法查询比 return 的所有记录按创建的降序排列。所以,它应该是 return 最近添加的记录。但是当我尝试添加新记录时,permalink.html
(它只是一个显示标题的页面,body 和新条目的创建日期)显示了最近添加的第二条记录。例如,我已经有三条记录,所以当我添加第四条记录时,permalink.html
没有显示第四条记录的详细信息,而是显示了第三条记录的详细信息。我做错了什么吗?
我不认为我的问题与此重复 - Read delay in App Engine Datastore after put()。这个问题是关于 put()
的读取延迟,而我正在使用 get()
。接受的答案还指出 get()
不会造成任何延迟。
这是因为 GQL 查询默认使用最终一致性。
您需要阅读:
- https://cloud.google.com/appengine/docs/python/datastore/data-consistency
- https://cloud.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency
- https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/
- 在 SO 和其他来源上搜索并阅读有关 Google Cloud Datastore 中强一致性和最终一致性的信息。
您可以为您的查询指定 read_policy=STRONG_CONSISTENCY
,但它具有您应该了解并考虑的相关费用。
我正在根据 Steve Hoffman 在 Udacity 上的 Web 开发课程构建一个基本博客。这是我的代码 -
import os
import webapp2
import jinja2
from google.appengine.ext import db
template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir), autoescape = True)
def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
return value.strftime(format)
jinja_env.filters['datetimeformat'] = datetimeformat
def render_str(template, **params):
t = jinja_env.get_template(template)
return t.render(params)
class Entries(db.Model):
title = db.StringProperty(required = True)
body = db.TextProperty(required = True)
created = db.DateTimeProperty(auto_now_add = True)
class MainPage(webapp2.RequestHandler):
def get(self):
entries = db.GqlQuery('select * from Entries order by created desc limit 10')
self.response.write(render_str('mainpage.html', entries=entries))
class NewPost(webapp2.RequestHandler):
def get(self):
self.response.write(render_str('newpost.html', error=""))
def post(self):
title = self.request.get('title')
body = self.request.get('body')
if title and body:
e = Entries(title=title, body=body)
length = db.GqlQuery('select * from Entries order by created desc').count()
e.put()
self.redirect('/newpost/' + str(length+1))
else:
self.response.write(render_str('newpost.html', error="Please type in a title and some content"))
class Permalink(webapp2.RequestHandler):
def get(self, id):
e = db.GqlQuery('select * from Entries order by created desc').get()
self.response.write(render_str('permalink.html', id=id, entry = e))
app = webapp2.WSGIApplication([('/', MainPage),
('/newpost', NewPost),
('/newpost/(\d+)', Permalink)
], debug=True)
在 class Permalink
中,我使用 get()
方法查询比 return 的所有记录按创建的降序排列。所以,它应该是 return 最近添加的记录。但是当我尝试添加新记录时,permalink.html
(它只是一个显示标题的页面,body 和新条目的创建日期)显示了最近添加的第二条记录。例如,我已经有三条记录,所以当我添加第四条记录时,permalink.html
没有显示第四条记录的详细信息,而是显示了第三条记录的详细信息。我做错了什么吗?
我不认为我的问题与此重复 - Read delay in App Engine Datastore after put()。这个问题是关于 put()
的读取延迟,而我正在使用 get()
。接受的答案还指出 get()
不会造成任何延迟。
这是因为 GQL 查询默认使用最终一致性。
您需要阅读:
- https://cloud.google.com/appengine/docs/python/datastore/data-consistency
- https://cloud.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency
- https://cloud.google.com/datastore/docs/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore/
- 在 SO 和其他来源上搜索并阅读有关 Google Cloud Datastore 中强一致性和最终一致性的信息。
您可以为您的查询指定 read_policy=STRONG_CONSISTENCY
,但它具有您应该了解并考虑的相关费用。