""" MySQL Connector. Manages interactions with MySQL for art_relations databse. """ from contextlib import contextmanager from sqlalchemy import create_engine from sqlalchemy import pool from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker from activity_detector import base_config def _create_engine(db_url): """Create engine based on config settings.""" if base_config.POOL_CLASS == pool.QueuePool: db_engine = create_engine( db_url, pool_size=base_config.POOL_SIZE, max_overflow=base_config.POOL_MAX_OVERFLOW, pool_recycle=base_config.POOL_RECYCLE_MS) return db_engine return create_engine(db_url, poolclass=base_config.POOL_CLASS) ar_db_engine = _create_engine(base_config.AR_DB_URL) ar_session_factory = sessionmaker(bind=ar_db_engine) ar_database_session = scoped_session(ar_session_factory) @contextmanager def ar_db_session(read_only=False): """ Provide transactional scope around series of operations for art_relations. Taken from http://docs.sqlalchemy.org/en/latest/orm/session_basics.html. This handles rollback and closing of session, so there is no need to do that throughout the code. Usage: with ar_database_session() as session: session.execute(query) """ session = ar_database_session() try: yield session if not read_only: session.commit() except: session.rollback() raise