0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLAlchemyでmulti databaseに対応する

Last updated at Posted at 2020-02-02

はじめに

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()を複数個上手く作ってあげればそれぞれ紐付けできて上手く行く気がしています。
ただし未検証。今やりたいこと終わったら検証してみます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?