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 の一般的な動作ですか。データストアに新しいレコードを追加するのに時間がかかりますか? レコードの挿入方法に問題はありませんか? 助けてください..

4

2 に答える 2

2

スリープの使用を考えるべきではありません。

あなたが見ているのは、HRD の「結果整合性」です。「Structuring Data for Strong Consistency」 https://developers.google.com/appengine/docs/python/datastore/structuring_for_strong_consistencyを読んで、強い整合性のあるクエリを作成するための戦略を説明しています。

余談ですが、ユーザー エンティティを put() しただけの場合は、クエリを実行する必要はありません。すでに存在しています。

于 2013-05-03T11:51:29.277 に答える
1

データストアに対する操作は、コミット フェーズと適用フェーズの 2 つの部分で行われます。

詳細については、https://developers.google.com/appengine/docs/python/datastore/overview#Datastore_Writes_and_Data_Visibilityをご覧ください。

ただし、短いバージョンでは、データストア操作は、適用フェーズの後ではなく、コミット フェーズの後に返されます。オブジェクトを追加/更新/削除するようにデータストアに指示した可能性がありますが、特定の操作が返された後でも、その操作の実行には数ミリ秒かかります。

コードに人為的な遅延を追加する必要がある場合があります。

import time
time.sleep(1)

または を使用できます@db.transactional。結果を表示する前に、トランザクションを使用して DB の一貫性を確保します。https://developers.google.com/appengine/docs/python/datastore/transactions

于 2013-05-03T11:14:42.687 に答える