示例#1
0
    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()