def migrate_db_to_version(self, db_handle, from_version, to_version): original_db_path = db_handle.db_path original_db_name = Path(original_db_path).stem backup_db_path = original_db_path + '.backup_' + pd.Timestamp.utcnow().strftime("%Y%m%d-%H%M%S") new_db_path = original_db_path + '.new' copyfile(original_db_path, new_db_path) copyfile(original_db_path, backup_db_path) db_handle.get_shared_session().close() db_handle.engine.dispose() new_db_handle = SQLConnectionManager(SQLConnectionType.TRADE_FILLS, new_db_path, original_db_name, True) relevant_transformations = [t for t in self.transformations if t.does_apply_to_version(from_version, to_version)] if relevant_transformations: logging.getLogger().info( f"Will run DB migration from {db_handle.get_local_db_version().value} to {to_version}") migration_succesful = False try: for transformation in sorted(relevant_transformations): logging.getLogger().info(f"Applying {transformation.name} to DB...") new_db_handle = transformation.apply(new_db_handle) logging.getLogger().info(f"DONE with {transformation.name}") migration_succesful = True except SQLAlchemyError: logging.getLogger().error("Unexpected error while checking and upgrading the local database.", exc_info=True) finally: try: new_db_handle.get_shared_session().close() new_db_handle.engine.dispose() if migration_succesful: move(new_db_path, original_db_path) db_handle.__init__(SQLConnectionType.TRADE_FILLS, original_db_path, original_db_name, True) except Exception as e: logging.getLogger().error(f"Fatal error migrating DB {original_db_path}") raise e return migration_succesful
def __init__(self, sql: SQLConnectionManager, trading_pair: str) -> None: self.base_asset, self.quote_asset = trading_pair.split("-") self._session = sql.get_shared_session()