"""drop dead storage_objects.parent_object_id column and idx_storage_parent Revision ID: f7a8b9c0d1e2 Revises: e1f2a3b4c5d6 Create Date: 2026-08-21 Removes a never-written column and its orphaned index. Tree structure is maintained entirely via relative_path (materialized path); see backend/src/backend/scripts.py (list_workspace_tree / list_workspace_directories). MySQL 8.0 does not support DROP INDEX IF EXISTS / DROP COLUMN IF EXISTS, so the calls below are unconditional. """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import mysql # revision identifiers, used by Alembic. revision: str = "f7a8b9c0d1e2" down_revision: str | Sequence[str] | None = "e1f2a3b4c5d6" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: """Drop the dead index, then the dead column.""" op.drop_index("idx_storage_parent", table_name="storage_objects") op.drop_column("storage_objects", "parent_object_id") # Refresh the table comment so the warning reaches the DB, not just the ORM. op.execute( "ALTER TABLE storage_objects " "COMMENT = 'Workspace 文件和 RustFS 对象的统一元数据;" "目录树走 materialized path (relative_path)," "不要 join 邻接表列——已删除。'" ) def downgrade() -> None: """Recreate the column and index for rollback.""" op.add_column( "storage_objects", sa.Column("parent_object_id", mysql.CHAR(length=26), nullable=True), ) op.create_index( "idx_storage_parent", "storage_objects", ["parent_object_id"], unique=False, ) op.execute( "ALTER TABLE storage_objects " "COMMENT = 'Workspace 文件和 RustFS 对象的统一元数据'" )