"""Load data from the database.""" import MySQLdb from accounting import config class DatabaseAdapter(): """DatabaseAdapter.""" def __init__(self): """Create the adapter.""" self._init = False def __del__(self): """Teardown connection.""" try: self._cursor.close() except AttributeError: pass try: self._connection.close() except AttributeError: pass def yield_rows(self, sql, args=()): """Yield 10000 rows at a time. For larger result sets.""" if not self._init: self._connect() self._init = True self._cursor.execute(sql, args) while True: results = self._cursor.fetchmany(10000) if not results: break for result in results: yield result def fetch_rows(self, sql, args=()): """Execute a query against the db and return the results. Args: sql (str): Valid MySQL select statement. Returns: Tuple[]: List of ordered tuples with the selected values in order. """ if not self._init: self._connect() self._init = True self._cursor.execute(sql, args) return self._cursor.fetchall() def execute(self, sql): """Execute SQL.""" if not self._init: self._connect() self._init = True self._cursor.execute(sql) def _connect(self): """Connect to db.""" self._connection = self._get_connection() self._connection.autocommit(True) self._cursor = self._connection.cursor() def _get_connection(self, db_config={}): """Mockable getter.""" if not db_config: db_config = { 'user': config.DB_USER, 'password': config.DB_PASS, 'host': config.DB_HOST, 'database': config.DB_NAME, } if config.DB_POOL_SIZE: db_config['pool_size'] = config.DB_POOL_SIZE return MySQLdb.connect(**db_config)