Files
ss-tools/backend/alembic/versions/u1v2w3x4y5z6_add_sync_duration_to_environments.py
busya 81ba94684f feat: sed-мутации датасетов, правки миграции и фиксы
- Dataset viewer: sed-замена (find→replace) по всем/выбранным/текущим датасетам
  с обязательным визуальным предпросмотром и целями (sql/metrics/yaml); сохранение
  и выбор именованных правил (sedRules store + SedRuleEditor).
- Migration: literal-замена в dataset YAML при переносе; рескан ID чартов/датасетов
  перед миграцией + метрика средней длительности синка (GET /migration/sync-stats);
  логическая группировка опций (маппинги БД, сервер изменений, rescan) под галочками.
- Fix: дашборды хаба скрывались дефолтным профиль-фильтром show_only_slug_dashboards=true
  (теперь false); мастер миграции не грузил дашборды предзаполненного источника;
  потеря терминального task_status из-за утечки pending-корутин в /ws/logs (панель
  результата не появлялась); горизонтальный скролл в MappingTable; чистая per-env
  ошибка в mapping coverage.
- Backend: record_sync_duration + alembic-миграция sync-duration; literal_replace модуль.
2026-08-19 10:29:28 +03:00

45 lines
1.4 KiB
Python

"""add ID-sync duration metrics to environments
Revision ID: u1v2w3x4y5z6
Revises: t1u2v3w4x5y6
Create Date: 2026-08-18
"""
from collections.abc import Sequence
import sqlalchemy as sa
from sqlalchemy import inspect
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "u1v2w3x4y5z6"
down_revision: str | Sequence[str] | None = "t1u2v3w4x5y6"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def _table_exists(table_name: str) -> bool:
conn = op.get_bind()
inspector = inspect(conn)
return table_name in inspector.get_table_names()
def upgrade() -> None:
"""Add last/avg sync duration + run count to environments for the pre-migration ID rescan reference."""
if not _table_exists("environments"):
return
op.add_column("environments", sa.Column("last_sync_duration_seconds", sa.Float(), nullable=True))
op.add_column("environments", sa.Column("sync_duration_avg_seconds", sa.Float(), nullable=True))
op.add_column(
"environments",
sa.Column("sync_run_count", sa.Integer(), nullable=False, server_default=sa.text("0")),
)
def downgrade() -> None:
"""Remove the ID-sync duration metrics columns."""
op.drop_column("environments", "sync_run_count")
op.drop_column("environments", "sync_duration_avg_seconds")
op.drop_column("environments", "last_sync_duration_seconds")