2024-06-07 19:20:43 发布
网友
我有一个名为Game的数据模型。在
Game
在Game模型中,我有两个名为player1和{}的属性,它们是它们的名称。在
player1
我想在game中找到一个播放器,但我不知道如何构建查询,因为gql不支持OR子句,因此我不能使用select * from Game where player1 = 'tom' or player2 = 'tom'语句。在
game
OR
select * from Game where player1 = 'tom' or player2 = 'tom'
那么,我该如何解决这个问题呢? 我需要修改我的数据模型吗?在
注意,使用Drew的模式不会带来性能上的提高,因为列表属性中的查询必须检查列表中所有元素的相等性。在
对于当前的数据模型,需要执行两个查询,一个用于player1,一个用于player2,然后将结果合并到本地Python代码中。在
另一个需要更改架构的选项是用一个ListProperty替换这两个字段,例如:
class Game(db.Model): players = db.ListProperty() game1.players = ['tom', 'bob'] game2.players = ['joe', 'tom'] # this query will match all games where tom is one of the players query = Game.all().filter('players =', 'tom')
这是因为现在可以用一个索引来查询玩家。在
我同意Drew的回答,但是如果您坚持自己的模式或者只想探索其他选项,您可以使用Python sets来寻找这两个查询的联合。在
name = "The Player" keys1 = set(Game.all(keys_only=True).filter("player1 =", name)) keys2 = set(Game.all(keys_only=True).filter("player2 =", name)) games = Game.get( list(keys1 | keys2) )
这个例子将使用3个RPC调用/查询,但是通过只获取键来执行联合,您将比通常的查询速度更快。但是,根据过滤的记录数量,您可能会发现不使用keys-only查询会更快,并使用更简单的检查,如
注意,使用Drew的模式不会带来性能上的提高,因为列表属性中的查询必须检查列表中所有元素的相等性。在
对于当前的数据模型,需要执行两个查询,一个用于player1,一个用于player2,然后将结果合并到本地Python代码中。在
另一个需要更改架构的选项是用一个ListProperty替换这两个字段,例如:
这是因为现在可以用一个索引来查询玩家。在
我同意Drew的回答,但是如果您坚持自己的模式或者只想探索其他选项,您可以使用Python sets来寻找这两个查询的联合。在
这个例子将使用3个RPC调用/查询,但是通过只获取键来执行联合,您将比通常的查询速度更快。但是,根据过滤的记录数量,您可能会发现不使用keys-only查询会更快,并使用更简单的检查,如
^{pr2}$相关问题 更多 >
编程相关推荐