diff --git a/alembic/versions/007_add_subscription_plan_fields.py b/alembic/versions/007_add_subscription_plan_fields.py index 2773aa5..b21b03b 100644 --- a/alembic/versions/007_add_subscription_plan_fields.py +++ b/alembic/versions/007_add_subscription_plan_fields.py @@ -21,19 +21,35 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - """Add missing columns to subscription_plans""" + """Add missing columns to subscription_plans (skip if already exists)""" + from alembic import op + import sqlalchemy as sa + from sqlalchemy import inspect + + # Get database connection + conn = op.get_bind() + inspector = inspect(conn) + existing_columns = {col['name'] for col in inspector.get_columns('subscription_plans')} # Custom billing cycle fields - op.add_column('subscription_plans', sa.Column('custom_cycle_enabled', sa.Boolean(), nullable=False, server_default='false')) - op.add_column('subscription_plans', sa.Column('custom_cycle_start_month', sa.Integer(), nullable=True)) - op.add_column('subscription_plans', sa.Column('custom_cycle_start_day', sa.Integer(), nullable=True)) - op.add_column('subscription_plans', sa.Column('custom_cycle_end_month', sa.Integer(), nullable=True)) - op.add_column('subscription_plans', sa.Column('custom_cycle_end_day', sa.Integer(), nullable=True)) + if 'custom_cycle_enabled' not in existing_columns: + op.add_column('subscription_plans', sa.Column('custom_cycle_enabled', sa.Boolean(), nullable=False, server_default='false')) + if 'custom_cycle_start_month' not in existing_columns: + op.add_column('subscription_plans', sa.Column('custom_cycle_start_month', sa.Integer(), nullable=True)) + if 'custom_cycle_start_day' not in existing_columns: + op.add_column('subscription_plans', sa.Column('custom_cycle_start_day', sa.Integer(), nullable=True)) + if 'custom_cycle_end_month' not in existing_columns: + op.add_column('subscription_plans', sa.Column('custom_cycle_end_month', sa.Integer(), nullable=True)) + if 'custom_cycle_end_day' not in existing_columns: + op.add_column('subscription_plans', sa.Column('custom_cycle_end_day', sa.Integer(), nullable=True)) # Dynamic pricing fields - op.add_column('subscription_plans', sa.Column('minimum_price_cents', sa.Integer(), nullable=False, server_default='3000')) - op.add_column('subscription_plans', sa.Column('suggested_price_cents', sa.Integer(), nullable=True)) - op.add_column('subscription_plans', sa.Column('allow_donation', sa.Boolean(), nullable=False, server_default='true')) + if 'minimum_price_cents' not in existing_columns: + op.add_column('subscription_plans', sa.Column('minimum_price_cents', sa.Integer(), nullable=False, server_default='3000')) + if 'suggested_price_cents' not in existing_columns: + op.add_column('subscription_plans', sa.Column('suggested_price_cents', sa.Integer(), nullable=True)) + if 'allow_donation' not in existing_columns: + op.add_column('subscription_plans', sa.Column('allow_donation', sa.Boolean(), nullable=False, server_default='true')) def downgrade() -> None: