Я использую master/slave sqlalchemy с помощью RoutingSession, например
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". И я обнаружил, что метод «get_bind» выполнялся дважды при использовании «session.add(r); session.commit()». Так почему дважды?
При использовании "session.execute('insert ...'); session.commit()" метод "get_bind" вызывался только один раз.