annotation/alembic/versions/3a083a1fbba0_first_revision.py (186 lines of code) (raw):

"""First revision Revision ID: 3a083a1fbba0 Revises: Create Date: 2021-11-19 12:00:29.218594 """ import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql from sqlalchemy.engine.reflection import Inspector # revision identifiers, used by Alembic. revision = "3a083a1fbba0" down_revision = None branch_labels = None depends_on = None def get_tables(): conn = op.get_bind() inspector = Inspector.from_engine(conn) return inspector.get_table_names() def upgrade(): tables = get_tables() # List of existing tables in database if "annotators" not in tables: op.create_table( "annotators", sa.Column( "user_id", postgresql.UUID(as_uuid=True), nullable=False ), sa.Column("default_load", sa.INTEGER(), nullable=False), sa.PrimaryKeyConstraint("user_id"), ) # Here and below this 'if' condition creates tables only for new db if "categories" not in tables: op.create_table( "categories", sa.Column("id", sa.INTEGER(), nullable=False), sa.Column("tenant", sa.VARCHAR(), nullable=True), sa.Column("name", sa.VARCHAR(), nullable=False), sa.Column("parent", sa.INTEGER(), nullable=True), sa.Column( "metadata", postgresql.JSONB(astext_type=sa.Text()), nullable=True, ), sa.Column("is_link", sa.BOOLEAN(), nullable=False), sa.ForeignKeyConstraint( ["parent"], ["categories.id"], ondelete="cascade" ), sa.PrimaryKeyConstraint("id"), ) op.create_check_constraint( "is_not_self_parent", "categories", "id != parent" ) # Add this constraint manually - not autogenerated by alembic op.create_index( op.f("ix_categories_is_link"), "categories", ["is_link"], unique=False, ) op.create_index( op.f("ix_categories_parent"), "categories", ["parent"], unique=False, ) if "jobs" not in tables: op.create_table( "jobs", sa.Column("job_id", sa.INTEGER(), nullable=False), sa.Column("is_auto_distribution", sa.BOOLEAN(), nullable=False), sa.Column("callback_url", sa.VARCHAR(), nullable=False), sa.Column("deadline", sa.TIMESTAMP(), nullable=True), sa.PrimaryKeyConstraint("job_id"), ) if "annotated_docs" not in tables: op.create_table( "annotated_docs", sa.Column("revision", sa.VARCHAR(), nullable=False), sa.Column("user", postgresql.UUID(as_uuid=True), nullable=True), sa.Column("pipeline", sa.INTEGER(), nullable=True), sa.Column( "date", sa.TIMESTAMP(), server_default=sa.text("now()"), nullable=False, ), sa.Column("file_id", sa.INTEGER(), nullable=False), sa.Column("job_id", sa.INTEGER(), nullable=False), sa.Column( "pages", postgresql.JSON(astext_type=sa.Text()), nullable=False ), sa.Column( "validated", postgresql.ARRAY(sa.INTEGER()), nullable=False ), sa.Column("tenant", sa.VARCHAR(), nullable=False), sa.CheckConstraint( '("user" IS NULL AND pipeline IS NOT NULL) OR ' '("user" IS NOT NULL AND pipeline IS NULL)', ), sa.ForeignKeyConstraint( ["user"], ["annotators.user_id"], ), sa.PrimaryKeyConstraint("revision", "file_id", "job_id"), ) if "association_job_annotator" not in tables: op.create_table( "association_job_annotator", sa.Column( "user_id", postgresql.UUID(as_uuid=True), nullable=False ), sa.Column("job_id", sa.INTEGER(), nullable=False), sa.ForeignKeyConstraint( ["job_id"], ["jobs.job_id"], ), sa.ForeignKeyConstraint( ["user_id"], ["annotators.user_id"], ), sa.PrimaryKeyConstraint("user_id", "job_id"), ) if "association_jobs_categories" not in tables: op.create_table( "association_jobs_categories", sa.Column("category_id", sa.INTEGER(), nullable=False), sa.Column("job_id", sa.INTEGER(), nullable=False), sa.ForeignKeyConstraint( ["category_id"], ["categories.id"], ), sa.ForeignKeyConstraint( ["job_id"], ["jobs.job_id"], ), sa.PrimaryKeyConstraint("category_id", "job_id"), ) if "files" not in tables: op.create_table( "files", sa.Column("file_id", sa.INTEGER(), nullable=False), sa.Column("tenant", sa.VARCHAR(), nullable=False), sa.Column("job_id", sa.INTEGER(), nullable=False), sa.Column("pages_number", sa.INTEGER(), nullable=False), sa.ForeignKeyConstraint( ["job_id"], ["jobs.job_id"], ), sa.PrimaryKeyConstraint("file_id", "job_id"), ) if "tasks" not in tables: op.create_table( "tasks", sa.Column("id", sa.INTEGER(), nullable=False), sa.Column("file_id", sa.INTEGER(), nullable=False), sa.Column("pages", postgresql.ARRAY(sa.INTEGER()), nullable=False), sa.Column("job_id", sa.INTEGER(), nullable=False), sa.Column( "user_id", postgresql.UUID(as_uuid=True), nullable=False ), sa.Column("is_validation", sa.BOOLEAN(), nullable=False), sa.Column( "status", postgresql.ENUM( "pending", "ready", "in_progress", "finished", name="taskstatusenumschema", ), nullable=False, ), sa.Column("deadline", sa.TIMESTAMP(), nullable=True), sa.ForeignKeyConstraint( ["job_id"], ["jobs.job_id"], ), sa.ForeignKeyConstraint( ["user_id"], ["annotators.user_id"], ), sa.PrimaryKeyConstraint("id"), ) # ### end Alembic commands ### def downgrade(): op.drop_table("tasks") op.drop_table("files") op.drop_table("association_jobs_categories") op.drop_table("association_job_annotator") op.drop_table("annotated_docs") op.drop_table("jobs") op.drop_index(op.f("ix_categories_parent"), table_name="categories") op.drop_index(op.f("ix_categories_is_link"), table_name="categories") op.drop_table("categories") op.drop_table("annotators") op.execute("DROP TYPE taskstatusenumschema;") # ### end Alembic commands ###