0004_candidate_source_identity.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. """Persist source-qualified logical identities for candidate workspace seeds.
  2. Revision ID: 0004_candidate_source_identity
  3. Revises: 0003_phase_three_publication
  4. """
  5. from __future__ import annotations
  6. from collections.abc import Sequence
  7. import sqlalchemy as sa
  8. from alembic import op
  9. from sqlalchemy.dialects import mysql
  10. revision: str = "0004_candidate_source_identity"
  11. down_revision: str | None = "0003_phase_three_publication"
  12. branch_labels: str | Sequence[str] | None = None
  13. depends_on: str | Sequence[str] | None = None
  14. def upgrade() -> None:
  15. timestamp = sa.DateTime(timezone=True).with_variant(mysql.DATETIME(fsp=6), "mysql")
  16. op.create_table(
  17. "script_build_candidate_source_identity",
  18. sa.Column("id", sa.BigInteger().with_variant(sa.Integer, "sqlite"), primary_key=True),
  19. sa.Column("workspace_artifact_version_id", sa.BigInteger(), nullable=False),
  20. sa.Column("entity_kind", sa.String(32), nullable=False),
  21. sa.Column("target_local_id", sa.BigInteger(), nullable=False),
  22. sa.Column("source_artifact_version_id", sa.BigInteger(), nullable=False),
  23. sa.Column("source_artifact_digest", sa.String(64), nullable=False),
  24. sa.Column("source_local_id", sa.BigInteger(), nullable=False),
  25. sa.Column("created_at", timestamp, nullable=False),
  26. sa.UniqueConstraint(
  27. "workspace_artifact_version_id",
  28. "entity_kind",
  29. "target_local_id",
  30. name="uq_candidate_source_target",
  31. ),
  32. sa.UniqueConstraint(
  33. "workspace_artifact_version_id",
  34. "source_artifact_version_id",
  35. "entity_kind",
  36. "source_local_id",
  37. name="uq_candidate_source_origin",
  38. ),
  39. sa.CheckConstraint(
  40. "entity_kind IN ('paragraph', 'element')", name="ck_candidate_source_kind"
  41. ),
  42. sa.CheckConstraint(
  43. "length(source_artifact_digest) = 64", name="ck_candidate_source_digest"
  44. ),
  45. )
  46. op.create_index(
  47. "ix_candidate_source_workspace",
  48. "script_build_candidate_source_identity",
  49. ["workspace_artifact_version_id"],
  50. )
  51. def downgrade() -> None:
  52. op.drop_index(
  53. "ix_candidate_source_workspace", table_name="script_build_candidate_source_identity"
  54. )
  55. op.drop_table("script_build_candidate_source_identity")