Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions backend/alembic/versions/v1_0_0_f061_enterprise_info_tenant_id.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = "f061_enterprise_info_tenant_id"
Expand All @@ -32,15 +30,38 @@


def upgrade() -> None:
# This migration must be idempotent with respect to a freshly created schema.
# 001_initial_schema.py builds the schema with Base.metadata.create_all(), which
# already produces enterprise_info.tenant_id because the model declares it, so an
# unconditional op.add_column() fails on every fresh deployment and
# `alembic upgrade head` cannot complete.
#
# The IF NOT EXISTS / IF EXISTS guards match the convention already used in
# 010_column_modify.py, and make the module docstring's "Safe for retry" claim hold.

# 1. Add tenant_id column with default uuid generator or nullable first if populated
op.add_column("enterprise_info", sa.Column("tenant_id", postgresql.UUID(as_uuid=True), nullable=True))
op.create_index(op.f("ix_enterprise_info_tenant_id"), "enterprise_info", ["tenant_id"], unique=False)
op.execute("ALTER TABLE enterprise_info ADD COLUMN IF NOT EXISTS tenant_id UUID")
op.execute(
"CREATE INDEX IF NOT EXISTS ix_enterprise_info_tenant_id ON enterprise_info (tenant_id)"
)

# 2. Drop legacy single info_type unique constraint
op.drop_constraint("enterprise_info_info_type_key", "enterprise_info", type_="unique")
op.execute("ALTER TABLE enterprise_info DROP CONSTRAINT IF EXISTS enterprise_info_info_type_key")

# 3. Create new composite unique constraint (tenant_id, info_type)
op.create_unique_constraint("uq_enterprise_info_tenant_type", "enterprise_info", ["tenant_id", "info_type"])
op.execute(
"""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint WHERE conname = 'uq_enterprise_info_tenant_type'
) THEN
ALTER TABLE enterprise_info
ADD CONSTRAINT uq_enterprise_info_tenant_type UNIQUE (tenant_id, info_type);
END IF;
END $$;
"""
)


def downgrade() -> None:
Expand Down