"""evotor webhook token flow: add evotor_user_id, make user_id nullable Revision ID: f6a7b8c9d0e1 Revises: e5f6a7b8c9d0 Branch Labels: None Depends On: None """ from alembic import op import sqlalchemy as sa revision = 'f6a7b8c9d0e1' down_revision = 'e5f6a7b8c9d0' branch_labels = None depends_on = None def upgrade() -> None: conn = op.get_bind() # Check existing columns columns = [row[0] for row in conn.execute(sa.text( "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS " "WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'evotor_connections'" ))] if 'evotor_user_id' not in columns: op.add_column('evotor_connections', sa.Column('evotor_user_id', sa.String(255), nullable=True)) # Check existing indexes indexes = [row[2] for row in conn.execute(sa.text( "SHOW INDEX FROM evotor_connections" ))] if 'uq_evotor_connections_evotor_user_id' not in indexes: op.create_unique_constraint('uq_evotor_connections_evotor_user_id', 'evotor_connections', ['evotor_user_id']) if 'ix_evotor_connections_evotor_user_id' not in indexes: op.create_index('ix_evotor_connections_evotor_user_id', 'evotor_connections', ['evotor_user_id']) op.alter_column('evotor_connections', 'user_id', existing_type=sa.Integer(), nullable=True) def downgrade() -> None: op.alter_column('evotor_connections', 'user_id', existing_type=sa.Integer(), nullable=False) op.drop_index('ix_evotor_connections_evotor_user_id', 'evotor_connections') op.drop_constraint('uq_evotor_connections_evotor_user_id', 'evotor_connections') op.drop_column('evotor_connections', 'evotor_user_id')