2016-09-15 21 views
1

使用SQLAlchemy,給定一個列表,我想確定列表中哪些值不存在於sqlite數據庫表中的給定列中。其中一種方法如下:使用SQLAlchemy,確定哪些列表值不在數據庫列

def get_user_ids_not_in_DB(self, user_ids): 
    query__belongs = User_DB.user_id.in_(user_ids) 
    select__user_ids_in_DB = self.SQL_Helper.db.query(User_DB.user_id).filter(query__belongs) 
    user_ids_in_DB = zip(*select__user_ids_in_DB.all())[0] 
    return list(set(user_ids) - set(user_ids_in_DB)) 

有沒有更快/更有效的方法來完成同樣的事情?

回答

2

選擇所有用戶,然後將外部連接到別名User_db對象然後爲非別名user_id添加空值的過濾器。

# an alias to a subquery on a table. All user ids in you list 
    ualias = aliased(User_DB, User_DB.user_id.in_(user_ids)) 

    results = self.SQL_Helper.db.query(User_DB.user_id)\ 
       .outerjoin(ualias, ualias.user_id == User_DB.user_id)\ 
       .filter(ualias.user_id == None) 

對不起,但它的要點。

+1

身份運營商不能超載,所以'ualias.user_id是None'評估爲'FALSE'蟒蛇方等你SQL中有'WHERE'錯誤。使用'ualias.user_id.is_(None)'或'ualias.user_id == None',SQLAlchemy會自動轉換爲'IS'。 –

+0

@IljaEverilä哎呀!接得好。我根據您的評論更新了我的答案 – Ray

1

這是最有效的,我能想到的(相當接近你的):

from future_builtins import zip, map 
from operator import itemgetter 

def get_user_ids_not_in_DB(self, user_ids): 
    unique_ids = set(user_ids) 
    query__belongs = User_DB.user_id.in_(unique_ids) 
    select__user_ids_in_DB = self.SQL_Helper.db.query(User_DB.user_id).filter(query__belongs) 
    user_ids_in_DB = set(map(itemgetter(0), select__user_ids_in_DB)) 
    return (unique_ids - user_ids_in_DB) 
相關問題