"""merge tasks into notes table Revision ID: 0004 Revises: 0003 Create Date: 2025-01-01 00:00:00.000000 """ from alembic import op import sqlalchemy as sa revision = "0004" down_revision = "0003" branch_labels = None depends_on = None def upgrade() -> None: # Add task columns to notes table op.add_column("notes", sa.Column("status", sa.Text(), nullable=True)) op.add_column("notes", sa.Column("priority", sa.Text(), nullable=True)) op.add_column("notes", sa.Column("due_date", sa.Date(), nullable=True)) op.create_index("ix_notes_status", "notes", ["status"]) conn = op.get_bind() # Migrate tasks that have companion notes: # Copy status/priority/due_date to the companion note, # and merge the task description into the note body if the note body is empty. conn.execute(sa.text(""" UPDATE notes SET status = t.status, priority = t.priority, due_date = t.due_date, body = COALESCE(NULLIF(t.description, ''), notes.body), tags = CASE WHEN array_length(t.tags, 1) IS NOT NULL THEN t.tags ELSE notes.tags END FROM tasks t WHERE t.note_id = notes.id """)) # Handle orphan tasks (note_id IS NULL) — insert them as new notes conn.execute(sa.text(""" INSERT INTO notes (title, body, tags, status, priority, due_date, created_at, updated_at) SELECT title, description, tags, status, priority, due_date, created_at, updated_at FROM tasks WHERE note_id IS NULL """)) # Drop tasks table and its indexes op.drop_table("tasks") # Drop the old enum types that are no longer used by any table op.execute("DROP TYPE IF EXISTS task_status") op.execute("DROP TYPE IF EXISTS task_priority") def downgrade() -> None: raise NotImplementedError("Downgrade not supported for this migration")