from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import scoped_session, sessionmaker DB_URI = 'mysql+pymysql://{user}:{password}@{host}:{port}/{database_name}' _engine = None def get_engine(config): """Create mysql engine""" global _engine if not _engine: _engine = create_engine(DB_URI.format( user=config.DB_USER, password=config.DB_PASS, host=config.DB_HOST, port=config.DB_PORT, database_name=config.DB_NAME)) return _engine @contextmanager def session_scope(config): """Provide a transactional scope around a series of operations.""" engine = get_engine(config=config) Session = scoped_session(sessionmaker(bind=engine)) session = Session() try: yield session except SQLAlchemyError: session.rollback() raise finally: session.close()