はじめに
AWS Auroraは書き込みと読み込みのエンドポイントが違います。
そういうケースでのpythonのSQLAlchemy対応方法をまとめました。
なので、前提としては書き込み用と読み込み用でエンドポイントが違うだけでModelが同じであるとしています。
環境
python 3.8.1
SQLAlchemy 1.3.12
query_propertyは使えません
SQLAlchemyの便利機能であるquery_propertyはアプリ内でsessionが1つであることを期待するため、残念ながら使用することは出来ませんでした。
コード的には以下のように書けてとても便利でしたが、multi databaseに対応するにはsessionがどうしても2つ必要になります。
User.query.all()
それではどうするのか
session2つ作って普通に呼び出せばOKです。
なので、クエリの呼び出しもsessionを使用した形で書く感じです。
session.query(User).all()
また、とあるセッションで取得したデータは別のセッションのinsertやupdateをそのままオブジェクトでやるとエラーになるため注意です。
具体的には以下のコードは動きません。
取得したデータ内の何処かにある状態を削除すれば動くと思いますが、素直に別オブジェクトに移し替えた方が無難です。
read_session = read_session()
users = read_session.query(User).all()
write_session = write_session()
write_session.add_all()
全体のソースコード
githubにあげてますので、詳しくはそちらをご覧ください。
おわりに
query_property便利ですが、どうにも対応できなく諦めました。
Modelがデータベース毎に分かれているのであれば、declarative_base()を複数個上手く作ってあげればそれぞれ紐付けできて上手く行く気がしています。
ただし未検証。今やりたいこと終わったら検証してみます。