def session_maker(databases, query_cls=Query, models_location='models', engine_params=None, session_params=None, session_class=orm.session.Session): ''' Session maker with multiple databases support. For each database there should be corresponding submodule of `models_location` package with `metadata` object for that database. models_location - put models filename name as 'models' ''' engine_params = engine_params or {} session_params = dict(session_params or {}) session_params.setdefault('autoflush', False) if isinstance(databases, basestring): engine = create_engine(databases, **engine_params) engine.logger = logging.getLogger('sqlalchemy.engine') binds = {} metadata = import_string(models_location, 'metadata') for table in metadata.sorted_tables: binds[table] = engine return orm.sessionmaker(class_=session_class, query_cls=query_cls, bind=engine, binds=binds, **session_params) binds = multidb_binds(databases, models_location, engine_params=engine_params) return orm.sessionmaker(class_=session_class, query_cls=query_cls, binds=binds, **session_params)
def multidb_binds(databases, package=None, engine_params=None): '''Creates dictionary to be passed as `binds` parameter to `sqlalchemy.orm.sessionmaker()` from dictionary mapping models module name to connection URI that should be used for these models. Models module must have `metadata` attribute. `package` when set must be a package or package name for all models modules.''' engine_params = engine_params or {} if not (package is None or isinstance(package, basestring)): package = getattr(package, '__package__', None) or package.__name__ binds = {} for ref, uri in databases.items(): md_ref = '.'.join(filter(None, [package, ref])) metadata = import_string(md_ref, 'metadata') engine = create_engine(uri, **engine_params) # Dot before [name] is required to allow setting logging level etc. for # all them at once. engine.logger = logging.getLogger('sqlalchemy.engine.[%s]' % ref) for table in metadata.sorted_tables: binds[table] = engine return binds
def session_maker(databases, query_cls=Query, models_location='models', engine_params=None, session_params=None, session_class=DBSession): engine_params = engine_params or {} session_params = dict(session_params or {}) session_params.setdefault('autoflush', False) binds = {} if isinstance(databases, basestring): engine = create_engine(databases, **engine_params) return orm.sessionmaker(class_=session_class, query_cls=query_cls, bind=engine, **session_params) for ref, uri in databases.items(): md_ref = '.'.join(filter(None, [models_location, ref])) metadata = import_string(md_ref, 'metadata') engine = create_engine(uri, **engine_params) engine.logger = logging.getLogger('sqlalchemy.engine.[%s]' % ref) for table in metadata.sorted_tables: binds[table] = engine return orm.sessionmaker(class_=session_class, query_cls=query_cls, binds=binds, **session_params)