def close_instance(self, connection: MySQLConnection, cursor: MySQLConnection) -> None: if connection is not None and connection.is_connected(): if cursor is not None: cursor.close() connection.close() self._logger.info( f"MySQL connection is closed. - PID: {os.getpid()}") else: self._logger.info( "Connection has been disconnect or be killed before.")
class MySqlDB: def __init__(self, settings): self.settings = dict(**settings) self.connection = None def init_connection(self): if self.connection is None: self.connection = MySQLConnection( host = self.settings.get('DB_HOST', '127.0.0.1'), port = self.settings.get('DB_PORT', 3306), user = self.settings.get('DB_USER', 'root'), password = self.settings.get('DB_PASSWORD', ''), database = self.settings.get('DB_NAME', 'mysql'), ) def is_connected(self): if self.connection is None: self.init_connection() return self.connection.is_connected() def reconnect(self, attempts, delay): if self.connection is None: self.init_connection() return self.connection.reconnect() def rollback(self): if self.connection is None: self.init_connection() self.connection.rollback() def commit(self): if self.connection is None: self.init_connection() self.connection.commit() @contextlib.contextmanager def cursor(self, buffered=True, rollback_on_error=True, **kwargs): if self.connection is None: self.init_connection() cursor = None try: kwargs = kwargs or {} kwargs.setdefault("dictionary", True) kwargs.setdefault("buffered", buffered) cursor = self.connection.cursor(**kwargs) yield cursor except MySqlError as error: if rollback_on_error: self.connection.rollback() raise error from None finally: if cursor: cursor.close() def fetchone(self, query, params=None, **kwargs): if self.connection is None: self.init_connection() cursor = None try: kwargs = kwargs or {"dictionary": True} kwargs.setdefault("buffered", True) cursor = self.connection.cursor(**kwargs) cursor.execute(query, params) result = cursor.fetchone() return result finally: if cursor: cursor.close() def fetchall(self, query, params=None, **kwargs): if self.connection is None: self.init_connection() cursor = None try: kwargs = kwargs or {"dictionary": True} kwargs.setdefault("buffered", True) cursor = self.connection.cursor(**kwargs) cursor.execute(query, params) result = cursor.fetchall() return result finally: if cursor: cursor.close() def close(self): if self.connection is not None: self.connection.close()