Files
rarelens/api/alembic/versions/a3e9ead256a5_initial_schema.py
T
kemal 5463f489a3
ci / api (push) Failing after 10s
ci / terraform (push) Failing after 11s
ci / web (push) Failing after 35s
ci / pipeline (push) Failing after 2m29s
ci / images (api) (push) Skipped
ci / images (ml) (push) Skipped
ci / images (pipeline) (push) Skipped
ci / images (web) (push) Skipped
Initial release: rarelens platform skeleton (AGPL-3.0)
End-to-end variant interpretation platform for rare genetic disease research:
SvelteKit UI, FastAPI + PostgreSQL API, Nextflow/Ensembl VEP pipeline,
LightGBM pathogenicity scoring with MLflow, K8s/ArgoCD/GCP infrastructure.
Public test data only; no clinical claims.
2026-09-11 16:55:35 +01:00

90 lines
4.1 KiB
Python

"""initial schema
Revision ID: a3e9ead256a5
Revises:
Create Date: 2026-09-11 15:36:04.335440
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = 'a3e9ead256a5'
down_revision: Union[str, None] = None
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('samples',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('name', sa.String(length=120), nullable=False),
sa.Column('vcf_uri', sa.Text(), nullable=False),
sa.Column('assembly', sa.String(length=10), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('name')
)
op.create_table('jobs',
sa.Column('id', sa.UUID(), nullable=False),
sa.Column('sample_id', sa.UUID(), nullable=False),
sa.Column('status', sa.Enum('queued', 'running', 'succeeded', 'failed', name='jobstatus'), nullable=False),
sa.Column('workflow_ref', sa.String(length=200), nullable=True),
sa.Column('vep_version', sa.String(length=40), nullable=True),
sa.Column('log', sa.Text(), nullable=True),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.Column('finished_at', sa.DateTime(timezone=True), nullable=True),
sa.ForeignKeyConstraint(['sample_id'], ['samples.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_table('variants',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('job_id', sa.UUID(), nullable=False),
sa.Column('chrom', sa.String(length=10), nullable=False),
sa.Column('pos', sa.Integer(), nullable=False),
sa.Column('ref', sa.Text(), nullable=False),
sa.Column('alt', sa.Text(), nullable=False),
sa.Column('gene', sa.String(length=60), nullable=True),
sa.Column('consequence', sa.String(length=120), nullable=True),
sa.Column('impact', sa.String(length=20), nullable=True),
sa.Column('hgvsc', sa.Text(), nullable=True),
sa.Column('hgvsp', sa.Text(), nullable=True),
sa.Column('gnomad_af', sa.Float(), nullable=True),
sa.Column('clinvar_sig', sa.String(length=120), nullable=True),
sa.Column('annotations', postgresql.JSONB(astext_type=sa.Text()), nullable=False),
sa.ForeignKeyConstraint(['job_id'], ['jobs.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_variants_chrom'), 'variants', ['chrom'], unique=False)
op.create_index(op.f('ix_variants_gene'), 'variants', ['gene'], unique=False)
op.create_index(op.f('ix_variants_job_id'), 'variants', ['job_id'], unique=False)
op.create_index(op.f('ix_variants_pos'), 'variants', ['pos'], unique=False)
op.create_table('predictions',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('variant_id', sa.Integer(), nullable=False),
sa.Column('model_name', sa.String(length=80), nullable=False),
sa.Column('model_version', sa.String(length=40), nullable=False),
sa.Column('score', sa.Float(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False),
sa.ForeignKeyConstraint(['variant_id'], ['variants.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('variant_id')
)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('predictions')
op.drop_index(op.f('ix_variants_pos'), table_name='variants')
op.drop_index(op.f('ix_variants_job_id'), table_name='variants')
op.drop_index(op.f('ix_variants_gene'), table_name='variants')
op.drop_index(op.f('ix_variants_chrom'), table_name='variants')
op.drop_table('variants')
op.drop_table('jobs')
op.drop_table('samples')
# ### end Alembic commands ###