2016-11-25 17 views

答えて

1

は可能な解決策を見る前に冗長性を削減するために、いくつかのエイリアスを定義できますバックエンド(RDBMS)

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

バージョン2:タプル比較

これは、すべてのバックエンドでは動作しませんが、MySQL、PostgreSQLのために働く必要があり tuple_ documentation

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

バージョン-3を参照してください:

this answerを参照してください。複数のORステートメントを使用します。 バージョン1とバージョン2がよりクリーンなので、それを使用する理由はありません。

バージョン4:

this questionを見る1つのカラムにバーコードとパートナーの連結。 これは基本的には独自の解決策です。 もう一度、他のバージョンがはるかにクリーンで、文字列などへの変換を必要としないので、使用する理由はありません。

0

問題を解決する必要があります。このクエリ:

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

このトリッキーな解決策は、のために働く必要があります。このようSQLAlchemyのORMに変換することができ

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

事実上すべての場合。

P, U = Product, UnallowedProduct 

バージョン-1:OUTER JOINを+ IS NULL

これはかなり普遍的ソリューションであり、すべてで動作するはずの

関連する問題