私はsqlalchemyのマスター/スレーブを使用しています。
engines = {
'master':create_engine("sqlite:///master.db"),
'other':create_engine("sqlite:///other.db"),
'slave1':create_engine("sqlite:///slave1.db"),
'slave2':create_engine("sqlite:///slave2.db"),
}
from sqlalchemy.orm import Session, sessionmaker
import random
class RoutingSession(Session):
def get_bind(self, mapper=None, clause=None):
if mapper and issubclass(mapper.class_, MyOtherClass):
return engines['other']
elif self._flushing:
return engines['master']
else:
return engines[
random.choice(['slave1','slave2'])
]
http://docs.sqlalchemy.org/en/rel_0_7/orm/session.html#custom-vertical-partitioning
「get_bind」メソッドでログを出力しました。そして、「session.add(r); session.commit()」を使用すると、「get_bind」メソッドが2回実行されたことがわかりました。では、なぜ2回なのか。
「session.execute('insert ...'); session.commit()」を使用する場合、「get_bind」メソッドは1回だけ呼び出されました。