きり丸の技術日記

技術検証したり、資格等をここに残していきます。

SQLAlchemyでwhere条件を変数化し、動的に変数に条件を追加する(1でも、2でも使えるはず)

※ 一部再現しきれていないので、誤っている可能性があります。

前提

  • SQLAlchemy
    • 2.0.11
      • ソースコードありません
    • 1.4.32

対応

次のどちらかで対応できます。

配列に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)

ちゃんといろんなケースを想定して書かないとダメですね。難しいです。

参考情報