mlflow/mlflow · error · RuntimeError

Move aborted: the following {resource_type} already exist in

Error message

Move aborted: the following {resource_type} already exist in workspace {target_workspace!r} and would conflict: {formatted}\nRename or remove the conflicting resources in the target workspace, then retry.

What it means

Before moving resources between workspaces, the command checks whether resources with the same identifying name/key already exist in the target workspace. If any would collide, the entire move is aborted with this RuntimeError listing the conflicting names (up to 10 unless verbose). This is a safety check: proceeding would create duplicates or violate uniqueness constraints.

Source

Thrown at mlflow/store/db/workspace_move.py:342

            matched = {row[0] for row in conn.execute(name_filter).fetchall()}
        elif names:
            matched = _resolve_names(conn, spec, source_workspace, names)
            name_filter = list(matched)
        else:
            matched = _resolve_names(conn, spec, source_workspace)
            name_filter = None

        if not matched:
            return MoveResult(names=[], row_count=0)

        if conflicts := _find_conflicts(
            conn, spec, source_workspace, target_workspace, name_filter
        ):
            formatted = format_truncated_list(
                [repr(name) for name in conflicts],
                max_rows=None if verbose else 10,
            )
            raise RuntimeError(
                f"Move aborted: the following {resource_type} already exist "
                f"in workspace {target_workspace!r} and would conflict: "
                f"{formatted}\n"
                "Rename or remove the conflicting resources in the target "
                "workspace, then retry."
            )

        table = spec.table
        name_col = table.c[spec.name_column]

        def _filtered(stmt, col, _nf=name_filter):
            return stmt.where(col.in_(_nf)) if _nf is not None else stmt

        row_count = conn.execute(
            _filtered(
                sa
                .select(sa.func.count())
                .select_from(table)

View on GitHub (pinned to 6a27f2decc)

Solutions

  1. Rename or delete the conflicting resources in the target workspace, then retry the move.
  2. Run with --verbose to see the full conflict list if it was truncated at 10 rows.
  3. If the target copies are stale, drop them so the move can recreate/move the source versions.

Example fix

# before
mlflow workspace move --source ws1 --target prod  # fails: experiment 'churn-v2' exists
# after
mlflow experiments rename --experiment-name churn-v2 --new-name churn-v2-imported  # in target
mlflow workspace move --source ws1 --target prod
Defensive patterns

Strategy: validation

Validate before calling

existing = {e.name for e in mlflow.search_experiments(view_type=ViewType.ALL)}
conflicts = desired_names & existing
if conflicts:
    print(f"Resolve before moving: {conflicts}")

Try / catch

try:
    move_resources(...)
except RuntimeError as e:
    if "would conflict" in str(e):
        print(e)  # lists conflicting names; rename/delete in target, then retry
    else:
        raise

Prevention

When it happens

Trigger: Running move_resources where an experiment, model, or other target resource in the source workspace has the same name as one already present in the target workspace. Detected by _assert_no_workspace_conflicts via get_workspace_table reflection.

Common situations: Re-running a partially completed or previously failed move; merging two workspaces that were set up independently with same-named experiments; CI re-executing a migration idempotently.

Related errors


AI-assisted analysis of mlflow/mlflow@6a27f2decc (2026-08-29). Data as JSON: /api/errors/c685372816c18bc8. Report an issue: GitHub.