import os from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker class DBConfig: """Database configuration.""" DB_NAME = os.environ['PSQL_DB_NAME'] DB_HOST = os.environ['PSQL_DB_HOST'] DB_PORT = int(os.environ.get('PSQL_DB_PORT', 5432)) DB_USER = os.environ['PSQL_DB_USER'] DB_PASS = os.environ['PSQL_DB_PASS'] DB_POOL_RECYCLE = int(os.environ.get('PSQL_DB_POOL_RECYCLE', 7200)) DB_POOL_SIZE = int(os.environ.get('PSQL_DB_POOL_SIZE', 1)) _config = DBConfig() engine = create_engine( 'postgresql+psycopg2://{user}:{password}@{host}:{port}/{database_name}'.format( user=_config.DB_USER, password=_config.DB_PASS, host=_config.DB_HOST, port=_config.DB_PORT, database_name=_config.DB_NAME), pool_recycle=_config.DB_POOL_RECYCLE, pool_size=_config.DB_POOL_SIZE ) _session_factory = scoped_session(sessionmaker(bind=engine)) _session = _session_factory() @contextmanager def session_scope(): """Provide a transactional scope around a series of operations. """ try: yield _session _session.commit() except: _session.rollback() raise finally: _session.close()