2013-05-03 18 views
1

我一直在应用程序引擎中遇到此问题。由于我是App Engine的新手,我不知道自己是否正确地使用它。数据存储区中新增的记录未在应用程序中反映

无论何时将新记录插入到数据存储区中,新插入的记录都不会在应用程序中反映出来。它只会在下次重新加载后出现。

这是简单的代码:添加用户和刚打印从用户表中的所有用户:

def add_user(name): 
    u = User(name = name) 
    u.put() 
    all_users = [u.name for u in User.all().order('name')] 
    #On printing 'all_users', it doesn't show recently added user 

这是在App Engine中的常见行为。在数据存储中添加新记录是否需要时间?插入记录的方式有什么不对吗?请帮助..

回答

2

你不应该考虑使用睡眠。

您所看到的是HRD中的“最终一致性”。阅读“为强一致性构建数据”https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistency,其中描述了制定强一致查询的策略。另一方面,如果您刚放入()一个用户实体,则不需要查询它,您已经拥有了它。

+0

put()方法后,如果您重定向到另一个页面(例如:用户信息显示页面),仍会发生同样的情况。数据将出现在下一页重新加载/刷新。 – 2013-05-03 12:07:45

+0

您是否阅读过关于一致性的文档? – 2013-05-03 14:41:07

+0

@NijinNarayanan:这就是发生在我身上的事情。 – rajpy 2013-05-03 15:02:00

1

数据存储上的操作分两部分进行:提交阶段和应用阶段。

您可以在https://developers.google.com/appengine/docs/python/datastore/overview#Datastore_Writes_and_Data_Visibility

阅读更多关于它但短期的版本是,数据存储区操作返回后提交阶段,而不是应用阶段后。您可能已经告诉数据存储添加/更新/删除一个对象,但即使在特定操作返回后,该操作仍需要几毫秒的时间才能执行。

您可能需要为代码添加人为延迟。您可以使用@db.transactional。在显示结果之前使用事务来确保数据库一致。 https://developers.google.com/appengine/docs/python/datastore/transactions

+0

我刚加入睡眠秒。它开始工作。我认为我的代码有问题!特别是在App Engine中,使用“sleep()”是一种很好的编程风格。它可能会消耗一些CPU周期。有没有更好的方法来处理这个问题。 – rajpy 2013-05-03 11:44:08

+0

您也可以使用@ db.transactional – 2013-05-03 12:00:50

+0

使用睡眠是最糟糕的策略之一。在跳转编码之前,您需要很好地理解数据存储的工作方式。很好地理解最终一致性,祖先查询以及通过键(不查询)进行获取的概念。你有一些阅读要做。 – 2013-05-03 14:38:15

相关问题