feat: Добавлена миграция 006 для исправления схемы БД
Some checks reported errors
continuous-integration/drone/push Build encountered an error
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
This commit is contained in:
90
migrations/versions/006_fix_missing_columns.py
Normal file
90
migrations/versions/006_fix_missing_columns.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""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 $$;
|
||||
""")
|
||||
Reference in New Issue
Block a user