2017-05-11 22 views
0

単純なクエリは、私のコードでは、このSqlalchemyを使用しているFlask用の動的クエリビルダはありますか?

User.query.filter(User.name == 'admin') 

のように見える、私が渡され、そのパラメータに基づいて、データベースからの結果をフィルタリングされているパラメータを確認する必要があります。

たとえば、Userテーブルにusername、location、およびemailなどのカラムが含まれている場合、requestパラメータにはそのいずれかが含まれているか、またはカラムの組み合わせを持つことができます。以下に示すように各パラメータをチェックしてフィルタを連鎖させるのではなく、1つのフィルタに渡すことができる1つの動的クエリ文字列を作成し、結果を返すことができます。私は、すべてのパラメータを評価し、クエリ文字列を生成する別の関数を作成したいと思います。クエリ文字列が生成されると、そのクエリ文字列オブジェクトを渡して、目的の結果を得ることができます。 ORMを使用する目的に反してRAW SQLクエリを使用しないようにしたい。

if location: 
    User.query.filter(User.name == 'admin', User.location == location) 
elif email: 
    User.query.filter(User.email == email) 

答えて

1

あなたは繰り返しクエリにfilterを適用することができます。

query = User.query 

if location: 
    query = query.filter(User.location == location) 

if email: 
    query = query.filter(User.email == email) 

あなただけの完全一致が必要な場合は、filter_byもあります:

criteria = {} 

# If you already have a dict, there are easier ways to get a subset of its keys 
if location: criteria['location'] = location 
if email: criteria['email'] = email 

query = User.query.filter_by(**criteria) 

あなたには、いくつかのものが気に入らない場合理由は、私が提供できる最高のものはこれです:

from sqlalchemy.sql.expression import and_ 


def get_query(table, lookups, form_data): 
    conditions = [ 
     getattr(table, field_name) == form_data[field_name] 
     for field_name in lookups if form_data[field_name] 
    ] 

    return table.query.filter(and_(*conditions)) 


get_query(User, ['location', 'email', ...], form_data) 
+0

私が避けたいのは、列の組み合わせを含めてフィルタを行う必要がある列がたくさんあることです。私が使用する必要がある場合、いくつのifsを想像してください。 –

+0

@ShwetabhSharan:「列の組み合わせ」がどのように問題になるかの例を挙げることができますか?ユーザー入力をSQLAlchemy関数に直接渡したくない場合(悪い考え方)には、少なくとも可能なすべてのルックアップキーをメモすることは避けてはいけません。 クエリ= query.filter(User.location ==場所) 電子メールの場合: クエリ= query.filter(User.email ==場所場合=、あなたUser.query を クエリを例を与えることを – Ryan

+0

電子メール) かの場所と電子メール: クエリ= query.filter(User.email ==電子メール、User.location ==場所) 場合は、ユーザー名と所在地: クエリ= query.filter(User.username ==ユーザ名、User.location == location) など –

関連する問題