2013-05-03 49 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

相關問題