Skip to content

Commit 4d32aa5

Browse files
committed
adding new db migration for cosmx tables
1 parent fa4dd66 commit 4d32aa5

2 files changed

Lines changed: 685 additions & 0 deletions

File tree

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
"""adding cosmx tables
2+
3+
Revision ID: 8624ea7f09cc
4+
Revises: 6192847ca318
5+
Create Date: 2025-08-27 14:47:12.322302
6+
7+
"""
8+
import igf_data
9+
from alembic import op
10+
import sqlalchemy as sa
11+
from sqlalchemy.dialects import mysql
12+
13+
# revision identifiers, used by Alembic.
14+
revision = '8624ea7f09cc'
15+
down_revision = '6192847ca318'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.create_table('cosmx_platform',
23+
sa.Column('cosmx_platform_id', mysql.INTEGER(unsigned=True), nullable=False),
24+
sa.Column('cosmx_platform_igf_id', sa.String(length=20), nullable=False),
25+
sa.Column('cosmx_platform_name', sa.String(length=20), nullable=True),
26+
sa.Column('date_created', sa.TIMESTAMP(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
27+
sa.PrimaryKeyConstraint('cosmx_platform_id'),
28+
sa.UniqueConstraint('cosmx_platform_igf_id'),
29+
mysql_charset='utf8',
30+
mysql_engine='InnoDB'
31+
)
32+
op.create_table('cosmx_run',
33+
sa.Column('cosmx_run_id', mysql.INTEGER(unsigned=True), nullable=False),
34+
sa.Column('cosmx_run_igf_id', sa.String(length=200), nullable=False),
35+
sa.Column('cosmx_run_name', sa.String(length=100), nullable=True),
36+
sa.Column('project_id', mysql.INTEGER(unsigned=True), nullable=False),
37+
sa.ForeignKeyConstraint(['project_id'], ['project.project_id'], onupdate='CASCADE', ondelete='CASCADE'),
38+
sa.PrimaryKeyConstraint('cosmx_run_id'),
39+
sa.UniqueConstraint('cosmx_run_igf_id'),
40+
mysql_charset='utf8',
41+
mysql_engine='InnoDB'
42+
)
43+
op.create_table('cosmx_slide',
44+
sa.Column('cosmx_slide_id', mysql.INTEGER(unsigned=True), nullable=False),
45+
sa.Column('cosmx_slide_igf_id', sa.String(length=100), nullable=False),
46+
sa.Column('cosmx_slide_name', sa.String(length=100), nullable=True),
47+
sa.Column('cosmx_run_id', mysql.INTEGER(unsigned=True), nullable=False),
48+
sa.Column('cosmx_platform_id', mysql.INTEGER(unsigned=True), nullable=False),
49+
sa.Column('panel_info', sa.String(length=100), nullable=True),
50+
sa.Column('assay_type', sa.String(length=100), nullable=True),
51+
sa.Column('version', sa.String(length=10), nullable=True),
52+
sa.Column('slide_run_date', sa.DATETIME(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
53+
sa.Column('slide_metadata', igf_data.igfdb.datatype.JSONType(), nullable=True),
54+
sa.Column('date_created', sa.TIMESTAMP(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
55+
sa.ForeignKeyConstraint(['cosmx_platform_id'], ['cosmx_platform.cosmx_platform_id'], onupdate='CASCADE', ondelete='CASCADE'),
56+
sa.ForeignKeyConstraint(['cosmx_run_id'], ['cosmx_run.cosmx_run_id'], onupdate='CASCADE', ondelete='CASCADE'),
57+
sa.PrimaryKeyConstraint('cosmx_slide_id'),
58+
sa.UniqueConstraint('cosmx_slide_igf_id'),
59+
mysql_charset='utf8',
60+
mysql_engine='InnoDB'
61+
)
62+
op.create_table('cosmx_fov',
63+
sa.Column('cosmx_fov_id', mysql.INTEGER(unsigned=True), nullable=False),
64+
sa.Column('cosmx_fov_name', sa.String(length=10), nullable=False),
65+
sa.Column('cosmx_slide_id', mysql.INTEGER(unsigned=True), nullable=False),
66+
sa.Column('slide_type', sa.Enum('RNA', 'PROTEIN', 'UNKNOWN'), server_default='UNKNOWN', nullable=False),
67+
sa.ForeignKeyConstraint(['cosmx_slide_id'], ['cosmx_slide.cosmx_slide_id'], onupdate='CASCADE', ondelete='CASCADE'),
68+
sa.PrimaryKeyConstraint('cosmx_fov_id'),
69+
sa.UniqueConstraint('cosmx_fov_name', 'cosmx_slide_id'),
70+
mysql_charset='utf8',
71+
mysql_engine='InnoDB'
72+
)
73+
op.create_table('cosmx_slide_attribute',
74+
sa.Column('cosmx_slide_attribute_id', mysql.INTEGER(unsigned=True), nullable=False),
75+
sa.Column('attribute_name', sa.String(length=200), nullable=False),
76+
sa.Column('attribute_value', igf_data.igfdb.datatype.JSONType(), nullable=True),
77+
sa.Column('cosmx_slide_id', mysql.INTEGER(unsigned=True), nullable=False),
78+
sa.ForeignKeyConstraint(['cosmx_slide_id'], ['cosmx_slide.cosmx_slide_id'], onupdate='CASCADE', ondelete='CASCADE'),
79+
sa.PrimaryKeyConstraint('cosmx_slide_attribute_id'),
80+
sa.UniqueConstraint('cosmx_slide_id', 'attribute_name'),
81+
mysql_charset='utf8',
82+
mysql_engine='InnoDB'
83+
)
84+
op.create_table('cosmx_fov_annotation',
85+
sa.Column('cosmx_fov_annotation_id', mysql.INTEGER(unsigned=True), nullable=False),
86+
sa.Column('cosmx_fov_id', mysql.INTEGER(unsigned=True), nullable=False),
87+
sa.Column('tissue_species', sa.Enum('HUMAN', 'MOUSE', 'UNKNOWN'), server_default='UNKNOWN', nullable=False),
88+
sa.Column('tissue_annotation', sa.String(length=100), nullable=True),
89+
sa.Column('tissue_ontology', sa.String(length=100), nullable=True),
90+
sa.Column('tissue_condition', sa.String(length=100), nullable=True),
91+
sa.ForeignKeyConstraint(['cosmx_fov_id'], ['cosmx_fov.cosmx_fov_id'], onupdate='CASCADE', ondelete='CASCADE'),
92+
sa.PrimaryKeyConstraint('cosmx_fov_annotation_id'),
93+
sa.UniqueConstraint('cosmx_fov_id'),
94+
mysql_charset='utf8',
95+
mysql_engine='InnoDB'
96+
)
97+
op.create_table('cosmx_fov_attribute',
98+
sa.Column('cosmx_fov_attribute_id', mysql.INTEGER(unsigned=True), nullable=False),
99+
sa.Column('attribute_name', sa.String(length=200), nullable=False),
100+
sa.Column('attribute_value', igf_data.igfdb.datatype.JSONType(), nullable=True),
101+
sa.Column('cosmx_fov_id', mysql.INTEGER(unsigned=True), nullable=False),
102+
sa.ForeignKeyConstraint(['cosmx_fov_id'], ['cosmx_fov.cosmx_fov_id'], onupdate='CASCADE', ondelete='CASCADE'),
103+
sa.PrimaryKeyConstraint('cosmx_fov_attribute_id'),
104+
sa.UniqueConstraint('cosmx_fov_id', 'attribute_name'),
105+
mysql_charset='utf8',
106+
mysql_engine='InnoDB'
107+
)
108+
op.create_table('cosmx_fov_protein_qc',
109+
sa.Column('cosmx_fov_protein_qc_id', mysql.INTEGER(unsigned=True), nullable=False),
110+
sa.Column('cosmx_fov_id', mysql.INTEGER(unsigned=True), nullable=False),
111+
sa.Column('mean_fluorescence_intensity', mysql.INTEGER(), nullable=True),
112+
sa.Column('mean_unique_genes_per_cell', mysql.INTEGER(), nullable=True),
113+
sa.Column('number_non_empty_cells', mysql.INTEGER(), nullable=True),
114+
sa.Column('pct_non_empty_cells', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
115+
sa.Column('percentile_10_fluorescence_intensity', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
116+
sa.Column('percentile_90_fluorescence_intensity', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
117+
sa.Column('fluorescence_intensity_mean_igg_control_intensity', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
118+
sa.ForeignKeyConstraint(['cosmx_fov_id'], ['cosmx_fov.cosmx_fov_id'], onupdate='CASCADE', ondelete='CASCADE'),
119+
sa.PrimaryKeyConstraint('cosmx_fov_protein_qc_id'),
120+
sa.UniqueConstraint('cosmx_fov_id'),
121+
mysql_charset='utf8',
122+
mysql_engine='InnoDB'
123+
)
124+
op.create_table('cosmx_fov_rna_qc',
125+
sa.Column('cosmx_fov_rna_qc_id', mysql.INTEGER(unsigned=True), nullable=False),
126+
sa.Column('cosmx_fov_id', mysql.INTEGER(unsigned=True), nullable=False),
127+
sa.Column('mean_transcript_per_cell', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
128+
sa.Column('mean_unique_genes_per_cell', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
129+
sa.Column('number_non_empty_cells', mysql.INTEGER(unsigned=True), nullable=True),
130+
sa.Column('pct_non_empty_cells', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
131+
sa.Column('percentile_90_transcript_per_cell', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
132+
sa.Column('percentile_10_transcript_per_cell', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
133+
sa.Column('mean_negprobe_counts_per_cell', igf_data.igfdb.datatype.DECIMALType(), nullable=True),
134+
sa.ForeignKeyConstraint(['cosmx_fov_id'], ['cosmx_fov.cosmx_fov_id'], onupdate='CASCADE', ondelete='CASCADE'),
135+
sa.PrimaryKeyConstraint('cosmx_fov_rna_qc_id'),
136+
sa.UniqueConstraint('cosmx_fov_id'),
137+
mysql_charset='utf8',
138+
mysql_engine='InnoDB'
139+
)
140+
op.drop_table('history')
141+
op.alter_column('experiment', 'platform_name',
142+
existing_type=mysql.ENUM('HISEQ2500', 'HISEQ4000', 'MISEQ', 'NEXTSEQ', 'NEXTSEQ2000', 'NOVASEQ6000', 'NANOPORE_MINION', 'DNBSEQ-G400', 'DNBSEQ-G50', 'DNBSEQ-T7', 'SEQUEL2', 'UNKNOWN'),
143+
type_=sa.Enum('HISEQ2500', 'HISEQ4000', 'MISEQ', 'NEXTSEQ', 'NANOPORE_MINION', 'NOVASEQ6000', 'DNBSEQ-G400', 'DNBSEQ-G50', 'DNBSEQ-T7', 'NEXTSEQ2000', 'SEQUEL2', 'UNKNOWN'),
144+
existing_nullable=False,
145+
existing_server_default=sa.text("'UNKNOWN'"))
146+
op.alter_column('pipeline', 'pipeline_name',
147+
existing_type=mysql.VARCHAR(length=50),
148+
type_=sa.String(length=120),
149+
existing_nullable=False)
150+
op.alter_column('pipeline_seed', 'seed_table',
151+
existing_type=mysql.ENUM('project', 'sample', 'experiment', 'run', 'file', 'seqrun', 'collection', 'analysis', 'unknown'),
152+
type_=sa.Enum('project', 'sample', 'experiment', 'run', 'file', 'seqrun', 'analysis', 'collection', 'unknown'),
153+
existing_nullable=False,
154+
existing_server_default=sa.text("'unknown'"))
155+
op.alter_column('project', 'project_igf_id',
156+
existing_type=mysql.VARCHAR(length=70),
157+
type_=sa.String(length=50),
158+
existing_nullable=False)
159+
op.alter_column('user', 'email_id',
160+
existing_type=mysql.VARCHAR(length=80),
161+
type_=sa.String(length=40),
162+
existing_nullable=False)
163+
op.drop_index('name', table_name='user')
164+
# ### end Alembic commands ###
165+
166+
167+
def downgrade():
168+
# ### commands auto generated by Alembic - please adjust! ###
169+
op.create_index('name', 'user', ['name'], unique=True)
170+
op.alter_column('user', 'email_id',
171+
existing_type=sa.String(length=40),
172+
type_=mysql.VARCHAR(length=80),
173+
existing_nullable=False)
174+
op.alter_column('project', 'project_igf_id',
175+
existing_type=sa.String(length=50),
176+
type_=mysql.VARCHAR(length=70),
177+
existing_nullable=False)
178+
op.alter_column('pipeline_seed', 'seed_table',
179+
existing_type=sa.Enum('project', 'sample', 'experiment', 'run', 'file', 'seqrun', 'analysis', 'collection', 'unknown'),
180+
type_=mysql.ENUM('project', 'sample', 'experiment', 'run', 'file', 'seqrun', 'collection', 'analysis', 'unknown'),
181+
existing_nullable=False,
182+
existing_server_default=sa.text("'unknown'"))
183+
op.alter_column('pipeline', 'pipeline_name',
184+
existing_type=sa.String(length=120),
185+
type_=mysql.VARCHAR(length=50),
186+
existing_nullable=False)
187+
op.alter_column('experiment', 'platform_name',
188+
existing_type=sa.Enum('HISEQ2500', 'HISEQ4000', 'MISEQ', 'NEXTSEQ', 'NANOPORE_MINION', 'NOVASEQ6000', 'DNBSEQ-G400', 'DNBSEQ-G50', 'DNBSEQ-T7', 'NEXTSEQ2000', 'SEQUEL2', 'UNKNOWN'),
189+
type_=mysql.ENUM('HISEQ2500', 'HISEQ4000', 'MISEQ', 'NEXTSEQ', 'NEXTSEQ2000', 'NOVASEQ6000', 'NANOPORE_MINION', 'DNBSEQ-G400', 'DNBSEQ-G50', 'DNBSEQ-T7', 'SEQUEL2', 'UNKNOWN'),
190+
existing_nullable=False,
191+
existing_server_default=sa.text("'UNKNOWN'"))
192+
op.create_table('history',
193+
sa.Column('log_id', mysql.INTEGER(display_width=10, unsigned=True), autoincrement=True, nullable=False),
194+
sa.Column('log_type', mysql.ENUM('CREATED', 'MODIFIED', 'DELETED'), nullable=False),
195+
sa.Column('table_name', mysql.ENUM('PROJECT', 'USER', 'SAMPLE', 'EXPERIMENT', 'RUN', 'COLLECTION', 'FILE', 'PLATFORM', 'PROJECT_ATTRIBUTE', 'EXPERIMENT_ATTRIBUTE', 'COLLECTION_ATTRIBUTE', 'SAMPLE_ATTRIBUTE', 'RUN_ATTRIBUTE', 'FILE_ATTRIBUTE'), nullable=False),
196+
sa.Column('log_date', mysql.TIMESTAMP(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False),
197+
sa.Column('message', mysql.TEXT(), nullable=True),
198+
sa.PrimaryKeyConstraint('log_id'),
199+
mysql_default_charset='utf8',
200+
mysql_engine='InnoDB'
201+
)
202+
op.drop_table('cosmx_fov_rna_qc')
203+
op.drop_table('cosmx_fov_protein_qc')
204+
op.drop_table('cosmx_fov_attribute')
205+
op.drop_table('cosmx_fov_annotation')
206+
op.drop_table('cosmx_slide_attribute')
207+
op.drop_table('cosmx_fov')
208+
op.drop_table('cosmx_slide')
209+
op.drop_table('cosmx_run')
210+
op.drop_table('cosmx_platform')
211+
# ### end Alembic commands ###

0 commit comments

Comments
 (0)