0

これはコードです:

def create_game(user_id):
    game = classes.Games(user_id = user_id)
    game.put()

def get_game(user_id):
    game_query = classes.Games.gql('WHERE user_id = :1', user_id)

    game = False
    for item in game_query:
        game = item

    if not game:
        create_game(user_id)
        get_game(user_id)
    else:
        return game

def render_page(self):
    message = 'this is a game page<br>'.decode('utf-8')

    user = creditentials.get_user(self)
    if not user:
        self.redirect('/')
        return

    game = get_game(user.key().id())

    message += 'current game ID: '.decode('utf-8') + str(game.key().id())

    self.response.write(message)

ゲームのインスタンスを 1 つだけ作成することを期待していますが、10 個作成するのではありません! どうやら GQL クエリは非同期的に実行され、行get_game(user_id)をスキップするだけの 3 番目 (?) のインスタンスから開始しますgame_query = classes.Games.gql('WHERE user_id = :1', user_id)

私は正しいですか?どうすればこれを回避できますか?

4

1 に答える 1

0

クエリはすぐには一貫性がないため、作成したばかりのエンティティは、すぐに実行されるクエリでは返されません。少し待つ必要があります。

あなたの場合、エンティティを照会する必要はありません。作成したばかりなので、エンティティが存在することがわかり、使用できます。create_game 関数を変更して新しいゲームを返し、それを使用します。

user_id が一意であると予想される場合 (クエリが与えられた場合、これが当てはまるようです)、それをエンティティ ID として使用できます。その後、クエリの代わりに get-by-id を使用できます。これにより、強い一貫性が得られます。

クエリの仕組みの詳細については、このドキュメント ページの「データの整合性」セクションを確認してください。

于 2013-08-22T19:49:50.417 に答える