53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
# #region Alembic.TranslateActiveRunGuard [C:3] [TYPE Module] [SEMANTICS alembic,migration,translate,concurrency]
|
|
# @BRIEF Enforces at most one pending/running translation run per job.
|
|
# @RELATION DEPENDS_ON -> [EXT:SQLAlchemy:Alembic]
|
|
# @POST Concurrent manual/scheduled triggers cannot create duplicate active runs.
|
|
"""add unique active translation run guard
|
|
|
|
Revision ID: d4e5f6a7b8c9
|
|
Revises: c3d4e5f6a7b8
|
|
"""
|
|
|
|
from collections.abc import Sequence
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
revision: str = "d4e5f6a7b8c9"
|
|
down_revision: str | Sequence[str] | None = "c3d4e5f6a7b8"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Create a partial unique index on supported application databases."""
|
|
bind = op.get_bind()
|
|
dialect = bind.dialect.name
|
|
if dialect == "postgresql":
|
|
op.create_index(
|
|
"uq_translation_runs_one_active_per_job",
|
|
"translation_runs",
|
|
["job_id"],
|
|
unique=True,
|
|
postgresql_where=sa.text("status IN ('PENDING', 'RUNNING')"),
|
|
)
|
|
elif dialect == "sqlite":
|
|
op.create_index(
|
|
"uq_translation_runs_one_active_per_job",
|
|
"translation_runs",
|
|
["job_id"],
|
|
unique=True,
|
|
sqlite_where=sa.text("status IN ('PENDING', 'RUNNING')"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Drop the active-run guard."""
|
|
bind = op.get_bind()
|
|
if bind.dialect.name in {"postgresql", "sqlite"}:
|
|
op.drop_index("uq_translation_runs_one_active_per_job", table_name="translation_runs")
|
|
|
|
|
|
# #endregion Alembic.TranslateActiveRunGuard
|