这是代码:
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)
我希望它只创建一个游戏实例,它会创建10个!外观上GQL查询是异步执行的,从get_game(user_id)
的第3个(?)实例开始,它只是跳过game_query = classes.Games.gql('WHERE user_id = :1', user_id)
行。
我是对的吗?我该如何避免这种情况?
答案 0 :(得分:0)
查询不是立即一致的,因此您刚刚创建的实体将不会在立即执行的查询中返回,您需要等待一段时间。
在您的情况下,您不需要查询实体 - 您刚刚创建它,因此您知道它存在,并且可以使用它。更改你的create_game函数以返回新游戏,然后使用它。
如果您希望您的user_id是唯一的(并且给出您的查询,这似乎是这种情况)您可以将其用作实体ID,那么您可以使用id-by-id而不是查询,这将强烈 - 是一致的。
查看this docs page上的“数据一致性”部分,详细了解查询的工作方式。