from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import scoped_session, sessionmaker from apollo_main_db.apollo.models import ApolloGoVersion from retrieve_and_save_mobile_versions.config import Config _config = Config() engine = create_engine( 'mysql+pymysql://{user}:{password}@{host}:{port}/{database_name}'.format( user=_config.MYSQL_DB_USER, password=_config.MYSQL_DB_PASS, host=_config.MYSQL_DB_HOST, port=_config.MYSQL_DB_PORT, database_name=_config.MYSQL_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 SQLAlchemyError: _session.rollback() raise finally: _session.close() def get_latest_version_query(os): """Return latest saved into DB versions data. """ return ( _session.query(ApolloGoVersion) .filter(ApolloGoVersion.os == os) .order_by(ApolloGoVersion.created_at.desc()) .first() )