97 lines
5.5 KiB
Python
97 lines
5.5 KiB
Python
"""add experiments
|
|
|
|
Revision ID: bd9f6a8b7c1d
|
|
Revises: 3419d4e56131
|
|
Create Date: 2026-03-30 23:40:00.000000
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = 'bd9f6a8b7c1d'
|
|
down_revision: Union[str, None] = '3419d4e56131'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
'experiments',
|
|
sa.Column('experiment_key', sa.String(length=64), nullable=False),
|
|
sa.Column('name', sa.String(length=120), nullable=False),
|
|
sa.Column('description', sa.String(length=512), nullable=True),
|
|
sa.Column('enabled', sa.Boolean(), nullable=False),
|
|
sa.Column('eligible_routes', sa.JSON(), nullable=False),
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
|
|
sa.PrimaryKeyConstraint('id'),
|
|
sa.UniqueConstraint('experiment_key'),
|
|
)
|
|
op.create_index(op.f('ix_experiments_enabled'), 'experiments', ['enabled'], unique=False)
|
|
op.create_index(op.f('ix_experiments_experiment_key'), 'experiments', ['experiment_key'], unique=False)
|
|
|
|
op.create_table(
|
|
'experiment_variants',
|
|
sa.Column('experiment_id', sa.Uuid(), nullable=False),
|
|
sa.Column('variant_key', sa.String(length=64), nullable=False),
|
|
sa.Column('label', sa.String(length=120), nullable=False),
|
|
sa.Column('allocation', sa.Integer(), nullable=False),
|
|
sa.Column('is_control', sa.Boolean(), nullable=False),
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
|
|
sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
|
|
sa.ForeignKeyConstraint(['experiment_id'], ['experiments.id'], ondelete='CASCADE'),
|
|
sa.PrimaryKeyConstraint('id'),
|
|
sa.UniqueConstraint('experiment_id', 'variant_key', name='uq_experiment_variants_experiment_variant'),
|
|
)
|
|
op.create_index(op.f('ix_experiment_variants_experiment_id'), 'experiment_variants', ['experiment_id'], unique=False)
|
|
|
|
op.create_table(
|
|
'experiment_events',
|
|
sa.Column('experiment_key', sa.String(length=64), nullable=False),
|
|
sa.Column('variant_key', sa.String(length=64), nullable=False),
|
|
sa.Column('session_id', sa.String(length=128), nullable=False),
|
|
sa.Column('user_id', sa.String(length=64), nullable=True),
|
|
sa.Column('path', sa.String(length=255), nullable=False),
|
|
sa.Column('event_type', sa.String(length=64), nullable=False),
|
|
sa.Column('conversion_value', sa.Numeric(precision=12, scale=2), nullable=True),
|
|
sa.Column('metadata', sa.JSON(), nullable=True),
|
|
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=False),
|
|
sa.Column('id', sa.Uuid(), nullable=False),
|
|
sa.PrimaryKeyConstraint('id'),
|
|
)
|
|
op.create_index(op.f('ix_experiment_events_created_at'), 'experiment_events', ['created_at'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_event_type'), 'experiment_events', ['event_type'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_experiment_key'), 'experiment_events', ['experiment_key'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_path'), 'experiment_events', ['path'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_session_id'), 'experiment_events', ['session_id'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_user_id'), 'experiment_events', ['user_id'], unique=False)
|
|
op.create_index(op.f('ix_experiment_events_variant_key'), 'experiment_events', ['variant_key'], unique=False)
|
|
op.create_index('ix_experiment_events_experiment_variant_created_at', 'experiment_events', ['experiment_key', 'variant_key', 'created_at'], unique=False)
|
|
op.create_index('ix_experiment_events_session_created_at', 'experiment_events', ['session_id', 'created_at'], unique=False)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index('ix_experiment_events_session_created_at', table_name='experiment_events')
|
|
op.drop_index('ix_experiment_events_experiment_variant_created_at', table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_variant_key'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_user_id'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_session_id'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_path'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_experiment_key'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_event_type'), table_name='experiment_events')
|
|
op.drop_index(op.f('ix_experiment_events_created_at'), table_name='experiment_events')
|
|
op.drop_table('experiment_events')
|
|
|
|
op.drop_index(op.f('ix_experiment_variants_experiment_id'), table_name='experiment_variants')
|
|
op.drop_table('experiment_variants')
|
|
|
|
op.drop_index(op.f('ix_experiments_experiment_key'), table_name='experiments')
|
|
op.drop_index(op.f('ix_experiments_enabled'), table_name='experiments')
|
|
op.drop_table('experiments')
|