何これ
SQLAlchemy 1.4以上で使える with_loader_criteria()
オプションを使うとかなり楽になる
(2021年3月にリリースされました-> Changelog)
良い事
- One to ManyでJOINする相手のテーブルをfilterしたい時に記述量が減る
-
lazy
の指定によらず何にでも効いてくれる
例
チャットルームとチャット参加者を管理するテーブルがあったとします。
また、2者の関係は relationship('ChatJoinedUser', backref="chat_rooms", lazy='joined')
で定義されています。
chat_rooms = session.query(ChatRoom).filter(and_(
ChatRoom.account_id == current_user.account_id,
ChatRoom.is_ended == False
)).options(with_loader_criteria(
ChatJoinedUser, ChatJoinedUser.attending_status != AttendingStatus.leaving)).all()
SELECT
(中略)
FROM
chat_rooms
LEFT OUTER JOIN
chat_joined_users AS chat_joined_users_1
ON
chat_rooms.chat_id = chat_joined_users_1.chat_id
AND
chat_joined_users_1.attending_status != 'XXXXXX'
WHERE
chat_rooms.account_id = 'YYYYYY'
AND
chat_rooms.is_ended = false
発行されるクエリはこんな感じになる。
SQLAlchemyはeager loading(積極的読み込み)に関するテクニックがバージョンによって違ったりrelationshipによっては使えなかったりするので、この関数が出てきてだいぶ楽になった。