【问题标题】:get() in Google Datastore doesn't work as intendedGoogle Datastore 中的 get() 无法按预期工作
【发布时间】:2016-09-01 10:06:21
【问题描述】:

我正在根据 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)

Permalink 类中,我在查询中使用get() 方法,而不是按创建降序返回所有记录。因此,它应该返回最近添加的记录。但是当我尝试添加新记录时,permalink.html(它只是一个显示新条目的标题、正文和创建日期的页面)显示最近添加的 SECOND。例如,我已经有了三条记录,所以当我添加第四条记录时,permalink.html 向我显示了第三条记录的详细信息,而不是显示第四条记录的详细信息。我做错了吗?

我不认为我的问题与此重复 - Read delay in App Engine Datastore after put()。这个问题是关于put() 的读取延迟,而我使用的是get()。接受的答案还指出get() 不会造成任何延迟。

【问题讨论】:

  • 不,我不这么认为。答案指出get() 不会导致任何读取延迟。
  • 这并不是真正的延迟,而是最终的一致性问题。有无数不完全匹配的问题与答案都归结为“阅读最终一致性”:)
  • 哦,好吧。谢谢。我将会。 :)
  • 抛开最终的一致性不谈,为什么你的Permalink.get 接受了帖子的id 而你却忽略它并查询最新的呢? get by id 避免了最终的一致性问题。

标签: python-2.7 google-app-engine google-cloud-datastore


【解决方案1】:

这是因为 GQL 查询默认使用最终一致性。

你需要阅读:

您可以为您的查询指定read_policy=STRONG_CONSISTENCY,但您应该注意并考虑到相关成本。

【讨论】:

  • 我刚刚通过包含它得到了一个 NameError。 global name 'STRONG_CONSISTENCY' is not defined
  • 对不起。我的错。我必须添加db.STRONG_CONSISTENCY。再次抱歉向您发送通知。
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2012-05-30
  • 1970-01-01
  • 2016-04-14
  • 2012-01-20
  • 1970-01-01
  • 2013-12-23
  • 2014-12-09
相关资源
最近更新 更多