SQLAlchemyを使用してフィルターを動的に構築する方法を探しています。つまり、列、演算子名、および比較値を指定して、対応するフィルターを作成します。
例を使用して説明しようとします(これはAPIの構築に使用されます)。次のモデルがあるとしましょう。
class Cat(Model):
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
クエリをフィルターにマップしたいと思います。例えば、
/cats?filter=age;eq;3
生成する必要がありますCat.query.filter(Cat.age == 3)
/cats?filter=age;in;5,6,7&filter=id;ge;10
生成する必要がありますCat.query.filter(Cat.age.in_([5, 6, 7])).filter(Cat.id >= 10)
私はそれがどのように行われたかを見回しましたが、各演算子名をコンパレーターなどに手動でマッピングする必要のない方法を見つけることができませんでした。たとえば、Flask-Restlessは、サポートされているすべての操作のディクショナリを保持し、対応するラムダ関数を格納します(ここにコードを記述します)。
SQLAlchemyのドキュメントを検索したところ、2つの潜在的なリードが見つかりましたが、どちらも満足のいくものではなかったようです。
using
Column.like
、Column.in_
...:これらの演算子は列で直接使用できるため、簡単に使用できますgetattr
が、一部が欠落しています(、、==
など>
)。Column.op
:egを使用しますが、これはすべてのオペレーター(つまり)Cat.name.op('=')('Hobbes')
で機能するとは限りません。in
機能なしでこれを行うためのクリーンな方法はありlambda
ますか?