2008年11月18日

SQLAlchemyのセッションについて

SQLAlchemyのセッションを学ぶ(セッション作成編) - HDEラボ
sessionmaker()では、データベースに接続するごとに違うオブジェクトが返ってきますが、scoped_session()では、同じオブジェクトが返ってきます。
session.remove()すると内部保持しているセッションを捨ててくれる。

sessionmaker()は、アプリケーション1つにデータベースが複数という場合に使用します。
scoped_session()は、アプリケーション1つにデータベースが1つという場合に使用します。

scoped_sessionは常に同じオブジェクトを返すわけではなくて、スレッドローカルでセッションを保持している。
これはWebアプリケーションがマルチスレッドで実行されている場合に、リクエストごとでsessionを扱えるようになっている。
あと、アプリケーション1つにデータベースが1つの意味がよく分からないのだが(例でもデータベースは1つだけのようだし...)、垂直分散したければ、複数metadataを用意してそれぞれに別のデータベースへの接続をバインドして、Table作成時に各metadataを割り振ってあげればいいので、セッションは無関係。