LoginSignup
11
6

More than 3 years have passed since last update.

条件にあわせてsqlalchemyのfilterを動的に生成する

Posted at

概要

sqlalchemyを利用した以下のような実装を見た。
渡されたユーザーリストから絞るか、テーブル全体から絞るかの差だけのメソッドであり、
(他の条件が完全に一致している)
修正を考えると共通化したほうがいいと思って解決方法を調べた。

def get_specified_age_users_from_user_list(user_name_list={}, age):
    """
    指定されたユーザーの中で特定年齢のユーザーをUserテーブルから取得する
    """
    users = session.query(User).\
        filter(users.age==age).\
        filter(users.name.in_(user_name_list)).\
        all()
    return users

def get_specified_age_users(age):
    """
    特定年齢のユーザーをUserテーブルから取得する
    """
    users = session.query(User).\
        filter(users.age==age).\
        all()
    return users

解決策

tuple 形式にした条件を and_ メソッドに渡す。

from sqlalchemy import and_

def get_specified_age_users(user_name_list={}, age):
    filters = []
    # 引数が渡された場合のみ条件を追加する
    if user_name_list:
        filters.append(User.name.in_(user_name_list))
    # and_の引数はtupleである必要があるのでtuple化している
    users = session.query(User).\
        filter(and_(*filters)).\
        all()
    return users

# 実行されるSQL
## 指定ありの場合
SELECT 省略
FROM users 
WHERE users.name IN (%s)

## 指定なしの場合
SELECT 省略
FROM users 
11
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
6