2016-12-13 228 views
1

我有一个表有enemy_one,fight_idenemy_twoSqlAlchemy如何查询列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

如果你没有使数据模型非规范化,你会有一个标签带有'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我打算得到一个列表,只有那两个彼此相斗,但你的'in_'是关键;) – user5617880

+1

当'enemy_one'和'enemy_two'是相同的时候,这个查询也会给你结果。我个人把它写成两个检查等号的'and_',而不是使用'or_'中的'in_',但是也有一个检查约束:'enemy_one'和'enemy_two'不能相同,假设这对你的应用程序来说是毫无意义的情况。 – adarsh

相关问题