概要
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