Ошибка «Невозможно удалить таблицу» при переходе на более раннюю версию
Это сценарий перегонного куба. Я создаю 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)
Я ожидаю, что при обновлении все таблицы будут созданы, а при понижении версии все таблицы будут удалены из БД без каких-либо ошибок.