2016-12-13 13 views
1

У меня есть таблица, которая имеет enemy_one, fight_id и enemy_two.SqlAlchemy как запросить столбец A == a и B == b и A == b и B == a

Дело, иногда enemy_two будет enemy_one и наоборот.

я могу сделать:

session.query(Fight.fight_id).filter(Fight.enemy_one=='Jack', Fight.enemy_two=='Fat Chinese').all() 

затем:

session.query(Fight.fight_id).filter(Fight.enemy_one=='Fat Chinese', Fight.enemy_two=='Jack').all() 

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

+0

Если вы не денормализуете свою модель данных, у вас есть вкладка le с 'fight_id' и' enemy_id', для любого количества врагов. Тогда вы можете просто проверить, что у вас есть записи для обоих врагов для данного 'fight_id'. Просто говорю. – 9000

ответ

1

С in_ пункта:

def get_fights(enemy_one, enemy_two): 
    return (
     session 
     .query(Fight) 
     .filter(Fight.enemy_one.in_([enemy_one, enemy_two])) 
     .filter(Fight.enemy_two.in_([enemy_one, enemy_two])) 
     .filter(Fight.enemy_one != Fight_enemy_two) 
    ) 

С п or_:

def get_fights(enemy_one, enemy_two): 
    return (
     session 
     .query(Fight) 
     .filter(or_(
      and_(Fight.enemy_one == enemy_one, Fight.enemy_two == enemy_two), 
      and_(Fight.enemy_one == enemy_two, Fight.enemy_two == enemy_one), 
     )) 
    ) 
+0

Я придерживаюсь' or_', потому что для меня больше смысла. Большое спасибо за вашу драгоценную помощь! :) – user5617880

0

Вы можете использовать функцию SQLAlchemy в or_() с оператором фильтра in_ так:

from sqlalchemy import or_ 

enemies = ['Fat Chinese', 'Jack'] 

session.query(Fight.fight_id).filter(
    or_(
     Fight.enemy_one.in_(enemies), 
     Fight.enemy_two.in_(enemies) 
     )).all() 
+0

Это не совсем то же выражение. Он будет включать «Бой, который имеет * или» врага как «Жирный китайский» или «Джек», а не только «Бой», который имеет * оба *, но в любом порядке. – univerio

+1

'session.query (Fight.fight_id) .filter (Fight.enemy_one.in_ (враги), Fight.enemy_two.in_ (враги)). All()' Кажется, это правильно, или я чего-то не хватает? @wanderlust Я намерен получить список, в котором только те 2 сражаются друг с другом, но ваш 'in_' является ключом;) – user5617880

+1

Этот запрос также даст вам результаты, когда' enemy_one' и 'enemy_two' совпадают. Я лично напишу это как два 'и' ', которые проверяют равенство, а не используют' in_', заключенные в 'or_', но также имеют ограничение проверки, что' enemy_one' и 'enemy_two' не могут быть одинаковыми, предполагая это было бы бессмысленным случаем для вашего приложения. – adarsh

Смежные вопросы