Source code for khufu_sqlalchemy

import sqlalchemy
import sqlalchemy.orm
import zope.sqlalchemy

SQLALCHEMY_URL = 'sqlalchemy.url'
DBSESSION = 'khufu.dbsession'
DBSESSION_ENGINE = 'khufu.dbengine'
DBSESSION_FACTORY = 'khufu.dbsession_factory'


def _setup_factory(registry):
    '''Ensure there is a session factory located somewhere in the registry.
    '''

    settings = registry.settings

    if DBSESSION_FACTORY in settings:
        return settings[DBSESSION_FACTORY]

    if DBSESSION_ENGINE in settings:
        engine = settings[DBSESSION_ENGINE]
        factory = sqlalchemy.orm.sessionmaker(
            bind=engine, extension=zope.sqlalchemy.ZopeTransactionExtension())
        settings[DBSESSION_FACTORY] = factory
        return factory

    url = settings[SQLALCHEMY_URL]
    engine = settings[DBSESSION_ENGINE] = sqlalchemy.create_engine(url)
    return _setup_factory(registry)


[docs]def includeme(config): '''Register components with the pyramid Configurator instance.''' config.include('pyramid_tm') _setup_factory(config.registry)
[docs]def dbsession(request, create=True): '''Return the active database session from the object specified. :param request: Normally an instance of ``pyramid.request.Request`` but can be any object with ``environ`` and ``registry`` attrs :param create: If no db session is active on the reqeust, create one, defaults to True ''' environ = request.environ if DBSESSION in environ: return environ[DBSESSION] if hasattr(request, 'context'): context = request.context if hasattr(context, 'db'): return context.db return sqlalchemy.orm.object_session(context) if create: environ[DBSESSION] = request.registry.settings[DBSESSION_FACTORY]() return environ[DBSESSION] return None