Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Создана миграция 006_fix_missing_columns.py - Автоматически добавляет отсутствующие столбцы: * participations.account_id с FK на accounts * winners.is_notified, is_claimed, claimed_at - Миграция идемпотентна (безопасна для повторного выполнения) - Добавлен откат (downgrade) функционал - Обновлена документация в README.md - Создан отчет MIGRATION_006_REPORT.md Теперь изменения БД применяются через alembic upgrade head
90 lines
3.3 KiB
Python
90 lines
3.3 KiB
Python
"""Add missing columns to fix database schema
|
|
|
|
Revision ID: 006
|
|
Revises: 005
|
|
Create Date: 2025-11-17 05:35:00.000000
|
|
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = '006'
|
|
down_revision = '005'
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Добавляем отсутствующий столбец account_id в participations (если еще не существует)
|
|
op.execute("""
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='participations' AND column_name='account_id') THEN
|
|
ALTER TABLE participations ADD COLUMN account_id INTEGER;
|
|
ALTER TABLE participations
|
|
ADD CONSTRAINT fk_participations_account_id
|
|
FOREIGN KEY (account_id) REFERENCES accounts(id)
|
|
ON DELETE SET NULL;
|
|
END IF;
|
|
END $$;
|
|
""")
|
|
|
|
# Добавляем отсутствующие столбцы в winners
|
|
op.execute("""
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='is_notified') THEN
|
|
ALTER TABLE winners ADD COLUMN is_notified BOOLEAN DEFAULT FALSE;
|
|
END IF;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='is_claimed') THEN
|
|
ALTER TABLE winners ADD COLUMN is_claimed BOOLEAN DEFAULT FALSE;
|
|
END IF;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='claimed_at') THEN
|
|
ALTER TABLE winners ADD COLUMN claimed_at TIMESTAMP WITH TIME ZONE;
|
|
END IF;
|
|
END $$;
|
|
""")
|
|
|
|
|
|
def downgrade() -> None:
|
|
# Удаляем добавленные столбцы в обратном порядке
|
|
|
|
# Удаляем столбцы из winners
|
|
op.execute("""
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='claimed_at') THEN
|
|
ALTER TABLE winners DROP COLUMN claimed_at;
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='is_claimed') THEN
|
|
ALTER TABLE winners DROP COLUMN is_claimed;
|
|
END IF;
|
|
|
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='winners' AND column_name='is_notified') THEN
|
|
ALTER TABLE winners DROP COLUMN is_notified;
|
|
END IF;
|
|
END $$;
|
|
""")
|
|
|
|
# Удаляем account_id из participations
|
|
op.execute("""
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='participations' AND column_name='account_id') THEN
|
|
ALTER TABLE participations DROP CONSTRAINT IF EXISTS fk_participations_account_id;
|
|
ALTER TABLE participations DROP COLUMN account_id;
|
|
END IF;
|
|
END $$;
|
|
""") |