Google App Engine gql запросить два свойства с одинаковой строкой - PullRequest
3 голосов
/ 04 мая 2011

У меня есть модель данных с именем Game.

В модели Game у меня есть два свойства с именами player1 и player2, которые являются их именами.

IЯ хочу найти игрока в game, но я не знаю, как построить запрос, потому что gql не поддерживает предложение OR, и тогда я не могу использовать оператор select * from Game where player1 = 'tom' or player2 = 'tom'.

Итак, какя могу решить этот вопрос?
Должен ли я изменить свою модель данных?

Ответы [ 3 ]

6 голосов
/ 04 мая 2011

С вашей текущей моделью данных вам нужно будет выполнить 2 запроса, один для 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')

Это работает, потому что игроков теперь можно запрашивать с одним индексом.

1 голос
/ 04 мая 2011

Я бы согласился с ответом Дрю как на путь, но если вы застряли со своей схемой или просто хотите изучить другие варианты, вы можете посмотреть, используя 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, но только путем извлечения ключей для выполнения объединения, которое вы делаете, быстрее, чем обычные запросы. Однако, в зависимости от того, сколько записей вы фильтруете, вы можете найти его быстрее без запроса только ключей и использовать более простую проверку, например

games1 = Game.all().filter("player1 =", name)
games2 = Game.all().filter("player2 =", name)
games = games1+filter(lambda x:x not in games1,games2)
0 голосов
/ 22 апреля 2012

Обратите внимание, что при использовании схемы Дрю производительность не возрастает, поскольку запросы в свойствах списка должны проверять равенство всех элементов списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...