SQLAlchemyの検索条件組み立て

投稿者: Anonymous

12月からPythonを学び始めました。FlaskとSQLAlchemyを使ってアプリを作ろうとしています。

困ったのが、検索条件の組み立てです。ベタにやるとこんな感じになると思います。名前と苗字を検索条件に入れてユーザーを探すイメージです。

def search():
  firstname =''
  lastname = ''
  rs = session.Query(User)
  if firstname:
     rs = rs.filter(User.firstname==firstname)
  if lastname:
     rs = rs.filter(User.lastname==lastname)

これしか方法が無いなら諦めるのですが、例えば検索条件に入れた変数(この場合はfirstname,lastname)がNoneとか空文字だったらfilterを通しても無視されるような感じに出来たら良いなぁ…と。

ユーザーから与えられる複数のリクエストパラメータに対して、よりスマートに検索条件を組み立てる方法があればご教示頂けると幸いです。

解決

細かい実行確認はしてないですが、多分

def search():
  firstname =''
  lastname = ''
  rs = session.Query(User)
  rs = rs.filter((User.firstname==firstname) | (not firstname))
  rs = rs.filter((User.lastname==lastname) | (not lastname))

で、いけるんじゃないでしょうか(ただ、フィルタにはなってしまいますが)。

& | は SQLAlchemyがビット演算子をオーバーロードしているものなので、 and, or ではありません。

& | を使う代わりに or_, and_ というのもあったと思います。

  rs.filter(or_(User.firstname==firstname, not firstname))

そうじゃなくて、イコールの比較がそもそもいらないなら
( 検索条件値が SQLでいうところのfirstname = '' or firstname is nullの時、 DBの値に依らず trueにしたいなら)

  rs.filter(not firstname).filter(not lastname)

で、いいと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *