SQLAlchemyのORMを使用して複数のフィールドでフィルタを適用するにはどうすればよいですか?SQLAlchemyの複合フィールドによるフィルタ
例:
SELECT p.* FROM product p
WHERE (p.barcode, p.partner) NOT IN (
SELECT barcode, partner
FROM unallowed_products
);
SQLAlchemyのORMを使用して複数のフィールドでフィルタを適用するにはどうすればよいですか?SQLAlchemyの複合フィールドによるフィルタ
例:
SELECT p.* FROM product p
WHERE (p.barcode, p.partner) NOT IN (
SELECT barcode, partner
FROM unallowed_products
);
は可能な解決策を見る前に冗長性を削減するために、いくつかのエイリアスを定義できますバックエンド(RDBMS)
q = (
session.query(P)
.outerjoin(U, and_(P.barcode == U.barcode, P.partner == U.partner))
.filter(U.id == None)
)
これは、すべてのバックエンドでは動作しませんが、MySQL、PostgreSQLのために働く必要があり tuple_
documentation
q = (
session.query(P)
.filter(~tuple_(P.barcode, P.partner).in_(
select([U.barcode, U.partner])
))
)
がthis answerを参照してください。複数のORステートメントを使用します。 バージョン1とバージョン2がよりクリーンなので、それを使用する理由はありません。
はthis questionを見る1つのカラムにバーコードとパートナーの連結。 これは基本的には独自の解決策です。 もう一度、他のバージョンがはるかにクリーンで、文字列などへの変換を必要としないので、使用する理由はありません。
問題を解決する必要があります。このクエリ:
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
これはかなり普遍的ソリューションであり、すべてで動作するはずの