2016-11-25 10 views

Antwort

1

Lets einige Aliase definieren, um Ausführlichkeit zu reduzieren, bevor bei möglichen Lösungen suchen:

P, U = Product, UnallowedProduct 

Version-1: OUTER JOIN + WHERE IS NULL

Das ist ganz universelle Lösung und sollte mit allen arbeiten Backends (RDBMS)

q = (
    session.query(P) 
    .outerjoin(U, and_(P.barcode == U.barcode, P.partner == U.partner)) 
    .filter(U.id == None) 
) 

Version-2: Tupel Vergleich

Dies gilt nicht für alle Backends arbeiten, sollte aber für mySQL arbeiten, postgresql Siehe tuple_ documentation

q = (
    session.query(P) 
    .filter(~tuple_(P.barcode, P.partner).in_(
     select([U.barcode, U.partner]) 
    )) 
) 

Version-3: Verwenden Sie mehrere OR-Anweisungen

this answer See. Es gibt keinen Grund, es zu verwenden, da Version-1 und Version-2 sauberer sind.

Version-4: Verkettung von Barcode und Partner in einer Spalte

this question See. Dies ist im Grunde Ihre eigene Lösung. Auch hier gibt es keinen Grund, es zu verwenden, da andere Versionen viel sauberer sind und keine Konvertierungen zu Strings usw. erfordern.

0

Diese Abfrage sollte das Problem lösen:

SELECT p.* FROM product p 
WHERE (p.barcode || "_" || p.partner) NOT IN (
    SELECT barcode || "_" || partner 
    FROM unallowed_products 
); 

, die SQLAlchemy ORM wie folgt übersetzt werden kann:

subquery = session.query(
    cast(UnallowedProducts.barcode, type_=Text) + 
    '_' + 
    cast(UnallowedProducts.partner, type_=Text) 
).subquery() 

session.query(Product)\ 
    .filter((
       cast(Product.id, type_=Text) + 
       '_' + 
       cast(Product.partner, type_=Text) 
      ).notin_(subquery)) 

Diese schwierige Lösung sollte für Arbeit praktisch in jedem Fall.

Verwandte Themen