2017-12-01 20 views
0

Iは、のようなクエリをフィルタリングすることができるよany() method使用:SQLAlchemyを使って、関連オブジェクト属性とRegexでフィルタリングする方法は?

session.query(Result).filter(Result.related_images.any(url='result1_1512149119.jpg')) 

これは例えば、関連オブジェクトResultImagesによって定義さImageオブジェクトとの関係を有するResultクラスに関連した画像に対してフィルタリングされsession.query(Result.related_images).all()は、Resultのエントリに関連して指定されたすべてのイメージを返します。上から最初のクエリを作る

、私は次の出力を得る:

session.query(Result).filter(Result.related_images.any(url='result2_1512149119.jpg')) 

う:私のデータベースで

result1_1512149091.jpg 
result1_1512149094.jpg 
result1_1512149097.jpg 
result1_1512149100.jpg 
result1_1512149103.jpg 
result1_1512149105.jpg 
result1_1512149109.jpg 
result1_1512149111.jpg 
result1_1512149113.jpg 
result1_1512149117.jpg 
result1_1512149119.jpg 
result1_1512149122.jpg 
result1_1512149125.jpg 
result1_1512149128.jpg 

を、そのような次のクエリ多くの結果を得るために多くの画像があり、次のデータを返します。

result2_1512149091.jpg 
result2_1512149094.jpg 
result2_1512149097.jpg 
result2_1512149100.jpg 
result2_1512149103.jpg 
result2_1512149105.jpg 
result2_1512149109.jpg 
result2_1512149111.jpg 
result2_1512149113.jpg 
result2_1512149117.jpg 
result2_1512149119.jpg 
result2_1512149122.jpg 
result2_1512149125.jpg 
result2_1512149128.jpg 

any()の機能がありますが、それをよりニュアンスのあるアプローチ(または可能であれば)に活用する方法についてはまだ不明です。たとえば、私が作成しているクエリの種類については、ファイル名の部分文字列であるresult1を事前に知っているだけです。

result1_1512149091.jpgサブストリングでフィルタリングされたクエリもresult1_1512149094.jpgを返す理由がわかりません。私の特定の使用のために、これは理想的ですが、私はなぜこのように動作するのか分かりません。たとえば、.any('result1')でフィルタリングすると、result1イメージの完全なリストも返されますが、何も返されません。

私が最終的にやってみたいのは、正規表現を使ってアソシエーションオブジェクトの属性値をフィルタリングすることです(.any(url={{REGEX EXPRESSION}})など)。これは可能でしょうか?

答えて

1

私が最終的にやってみたいのは、正規表現を使ってアソシエーションオブジェクトの属性値をフィルタリングすることです(.any(url={{REGEX EXPRESSION}})など)。これは可能でしょうか?

です。任意のSQL式をany()に渡すことができます。たとえば、LIKE startswith()を用いた発現、contains()like()自体、または何を持っている:

session.query(Result).\ 
    filter(Result.related_images.any(
     Image.url.startswith('result1'))) 

正規表現を使用すると、通常、ビットDB固有のものです、そしてあなたは、あなたの質問に情報のビットを省略したので、私ましたこの答えでそれを避けようとしました。しかし、LIKE式と同じ方法で使用します。

+0

すごく、ありがとう! 'regex'を使うことは、私が持っていた考え方に過ぎませんでした。あなたのアプローチはまさに私が達成しようとしていたものだと思います。 – theeastcoastwest

関連する問題