2016-09-15 4 views
1

Mit SQLAlchemy, eine Liste gegeben, möchte ich bestimmen, welche Werte in der Liste nicht in einer bestimmten Spalte in einer SQLite DB-Tabelle vorhanden sind. Eine Möglichkeit ist folgende:Mit SQLAlchemy bestimmen, welche Listenwerte nicht in einer DB-Spalte sind

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)) 

Gibt es einen schnelleren/effizienteren Weg, um dasselbe zu erreichen?

Antwort

2

Wählen Sie alle Benutzer, dann äußere Join zu einem Aliased das User_db-Objekt Fügen Sie dann einen Filter für nicht-Aliased user_id's hinzu, die null sind.

# 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) 

Pardon Tippfehler, aber das ist der Kern davon.

+1

Die Identität Operator kann nicht überlastet werden, so 'ualias.user_id ist None' ausgewertet' false' Python Seite und schauen Sie habe 'WHERE false' in SQL. Verwenden Sie 'ualias.user_id.is_ (None)' oder 'ualias.user_id == None', was SQLAlchemy automatisch in' IS' konvertiert. –

+0

@ IljaEverilä Whoops! Guter Fang. Ich habe meine Antwort basierend auf Ihrem Kommentar aktualisiert – Ray

1

, dass die effizienteste ist ich (ganz in der Nähe Ihrer) denken kann:

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) 
Verwandte Themen