2016-12-13 279 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

相關問題