※ 一部再現しきれていないので、誤っている可能性があります。
前提
- SQLAlchemy
- 2.0.11
- ソースコードありません
- 1.4.32
- 2.0.11
対応
次のどちらかで対応できます。
配列にand_インスタンスを設定し、最後に*で展開する
※ 2.0.11, 1.4.32でも確認できています。
criteria = [] criteria.append(and_(User.name == 1)) criteria.append(and_(User.email == "1@example.com")) criteria.append(and_(User.age == 30)) (await db.execute(select(User).where(*criteria))).scalars().all()
and_インスタンスに*で展開しながら追加する
※ 2.0.11では動きましたが、1.4.32では動きませんでした。
criteria = and_(User.name == 1) criteria = and_(User.email == "1@example.com", *criteria) criteria = and_(User.age == 30, *criteria) (await db.execute(select(User).where(criteria))).scalars().all()
ソースコード
1.4.32のバージョンのソースコードはあります。
終わりに
SQLAlchemy 2からだと思うのですが、andで生成されるインスタンスから、andメソッドが呼べるようになっています。 ですので、条件追加する記載方法は次のように書いてました。ただ、どうやらこの書き方だと検索条件がANDで追加するのではなく、最後の条件で上書きしてしまうようでした。
criteria = and_(User.name == 1) criteria = criteria.and_(User.email == "1@example.com") criteria = criteria.and_(User.age == 30)
ちゃんといろんなケースを想定して書かないとダメですね。難しいです。
参考情報
- 条件にあわせてsqlalchemyのfilterを動的に生成する - Qiita
- 配列に条件を設定する方法は、自分の検証した後にこちらのQiitaの記事にて知りました