Ошибка «Невозможно удалить таблицу» при переходе на более раннюю версию

Это сценарий перегонного куба. Я создаю 5 таблиц. Обновление происходит без каких-либо ошибок, но при переходе на более раннюю версию невозможно создать таблицу из-за ограничений внешнего ключа. Поэтому я хотел сначала снять ограничение, однако это не работает.

Не могли бы вы пройтись по сценарию один раз, просто сказать, правильный ли указанный порядок и действительно ли требуется снять ограничения?

      """dft-475

Revision ID: a20b68fe33ef
Revises: 88cfd172e396
Create Date: 2023-11-07 16:57:12.201180

"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy_utils import UUIDType
from datetime import datetime
from enum import Enum

# revision identifiers, used by Alembic.
revision = "a20b68fe33ef"
down_revision = "88cfd172e396"
branch_labels = None
depends_on = None

VC_ACCOUNT = "vc_account"
TICKETING_SYSTEM_SETTINGS = "ticketing_system_settings"
TICKETING_SYSTEM_WEBHOOK_SETTINGS = "ts_webhook_settings"
TICKETING_SYSTEM_WEBHOOK_HEADERS = "ts_webhook_headers"
TICKETING_SYSTEM_WEBHOOK_EVENTS = "ts_webhook_events"
TICKETING_SYSTEM_WEBHOOK_SUBSCRIBED_EVENTS = "ts_webhook_subs_events"

class WebhookStatus(Enum):
    active = 0x0
    inactive = 0x1

def upgrade() -> None:
    op.create_table(
        TICKETING_SYSTEM_SETTINGS,
        sa.Column(
            "ticket_id",
            UUIDType(),
            server_default=sa.text("(UUID_TO_BIN(UUID()))"),
            nullable=False,
            primary_key=True,
        ),
        sa.Column(
            "name",
            sa.String(64),
            nullable=False,
        ),
        sa.Column(
            "type",
            sa.String(64),
            nullable=False,
        ),
        sa.Column(
            "created_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
        ),
        sa.Column(
            "updated_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
            onupdate=datetime.now,
        ),

        # Foreign Keys
        sa.Column(
            "tenant_id",
            sa.BigInteger(),
            nullable=False,
        ),

        # Constraints
        sa.ForeignKeyConstraint(
            ["tenant_id"],
            [f"{VC_ACCOUNT}.tenants.tenant_id"],
            name="fk_ticketing_system_settings_tenant_id_tenants",
            ondelete="CASCADE",
        ),
        schema=VC_ACCOUNT,
    )

    op.create_table(
        TICKETING_SYSTEM_WEBHOOK_SETTINGS,
        sa.Column(
            "ts_webhook_id",
            UUIDType(),
            server_default=sa.text("(UUID_TO_BIN(UUID()))"),
            nullable=False,
            primary_key=True,
        ),
        
        sa.Column(
            "name",
            sa.String(64),
            nullable=False,
        ),
        sa.Column(
            "endpoint",
            sa.String(64),
            nullable=False,
        ),
        sa.Column(
            "basic_auth_username",
            sa.String(64),
            nullable=True,
        ),
        sa.Column(
            "basic_auth_password",
            sa.String(64),
            nullable=True,
        ),
        sa.Column(
            "status",
            sa.Enum(WebhookStatus),
            nullable=False,
        ),

        sa.Column(
            "created_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
        ),

        sa.Column(
            "updated_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
            onupdate=datetime.now,
        ),

        # Foreign Keys
        sa.Column(
            "ticket_id",
            UUIDType(),
            nullable=False,
        ),

        # Constraints
        sa.ForeignKeyConstraint(
            ["ticket_id"],
            [f"{VC_ACCOUNT}.ticketing_system_settings.ticket_id"],
            name="fk_ts_webhook_settings_ticket_id_ticketing_system_settings",
            ondelete="CASCADE",
        ),
        schema=VC_ACCOUNT,
    )

    op.create_table(
        TICKETING_SYSTEM_WEBHOOK_HEADERS,
        sa.Column(
            "ts_webhook_header_id",
            UUIDType(),
            server_default=sa.text("(UUID_TO_BIN(UUID()))"),
            nullable=False,
            primary_key=True,
        ),
        sa.Column(
           "key",
           sa.String(32),
           nullable=False
        ),
        sa.Column(
            "value",
            sa.String(128),
            nullable=False,
        ),

        sa.Column(
            "created_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
        ),

        sa.Column(
            "updated_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
            onupdate=datetime.now,
        ),

        # Foreign Keys
        sa.Column(
            "ts_webhook_id",
            UUIDType(),
            nullable=False,
        ),

        # Constraints
        sa.ForeignKeyConstraint(
            ["ts_webhook_id"],
            [f"{VC_ACCOUNT}.ts_webhook_settings.ts_webhook_id"],
            name="fk_ts_webhook_headers_ts_webhook_id_ts_webhook_settings",
            ondelete="CASCADE",
        ),
        schema=VC_ACCOUNT,
    )

    op.create_table(
        TICKETING_SYSTEM_WEBHOOK_EVENTS,

        sa.Column(
            "ts_webhook_event_id",
            UUIDType(),
            server_default=sa.text("(UUID_TO_BIN(UUID()))"),
            nullable=False,
            primary_key=True,
        ),

        sa.Column(
            "name",
            sa.String(32),
            nullable=False,
            unique=True,  
        ),

        sa.Column(
            "format",
            sa.JSON(),
            nullable=False,
        ),
        sa.Column(
            "created_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
        ),

        sa.Column(
            "updated_on",
            sa.DateTime,
            nullable=False,
            default=datetime.now,
            server_default=sa.func.now(),
            onupdate=datetime.now,
        ),

        schema=VC_ACCOUNT,
    )
    
    op.create_table(
        TICKETING_SYSTEM_WEBHOOK_SUBSCRIBED_EVENTS,

        sa.Column("ts_webhook_id", UUIDType()),
        sa.Column("ts_webhook_event_id", UUIDType()),

        # Constraints
        sa.ForeignKeyConstraint(
            ["ts_webhook_id"],
            [f"{VC_ACCOUNT}.ts_webhook_settings.ts_webhook_id"],
            name="fk_ts_webhook_subs_events_ts_webhook_id_ts_webhook_settings",
            ondelete="CASCADE",
        ),

        sa.ForeignKeyConstraint(
            ["ts_webhook_event_id"],
            [f"{VC_ACCOUNT}.ts_webhook_events.ts_webhook_event_id"],
            name="fk_ts_webhook_subs_events_ts_webhook_event_id_ts_webhook_events",
            ondelete="CASCADE",
        ),
        schema=VC_ACCOUNT,
    )


def downgrade() -> None:
    op.drop_constraint(
        constraint_name="fk_ts_webhook_subs_events_ts_webhook_id_ts_webhook_settings",
        table_name="ts_webhook_subs_events",
        type_="foreignkey",
        schema=VC_ACCOUNT,
    )

    op.drop_constraint(
        constraint_name="fk_ts_webhook_subs_events_ts_webhook_event_id_ts_webhook_events",
        table_name="ts_webhook_subs_events",
        type_="foreignkey",
        schema=VC_ACCOUNT,
    )

    op.drop_constraint(
        constraint_name="fk_ts_webhook_headers_ts_webhook_id_ts_webhook_settings",
        table_name="ts_webhook_headers",
        type_="foreignkey",
        schema=VC_ACCOUNT,
    )

    op.drop_constraint(
        constraint_name="fk_ts_webhook_settings_ticket_id_ticketing_system_settings",
        table_name="ts_webhook_settings",
        type_="foreignkey",
        schema=VC_ACCOUNT,
    )

    op.drop_constraint(
        constraint_name="fk_ticketing_system_settings_tenant_id_tenants",
        table_name="ticketing_system_settings",
        type_="foreignkey",
        schema=VC_ACCOUNT,
    )
    
    op.drop_table(TICKETING_SYSTEM_SETTINGS, schema=VC_ACCOUNT)
    op.drop_table(TICKETING_SYSTEM_WEBHOOK_SETTINGS, schema=VC_ACCOUNT)
    op.drop_table(TICKETING_SYSTEM_WEBHOOK_HEADERS, schema=VC_ACCOUNT)
    op.drop_table(TICKETING_SYSTEM_WEBHOOK_EVENTS, schema=VC_ACCOUNT)
    op.drop_table(TICKETING_SYSTEM_WEBHOOK_SUBSCRIBED_EVENTS, schema=VC_ACCOUNT)


Я ожидаю, что при обновлении все таблицы будут созданы, а при понижении версии все таблицы будут удалены из БД без каких-либо ошибок.

0 ответов

Другие вопросы по тегам