2016-09-15 107 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) 
相关问题