Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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)