Skip to content

P9: squash migration trees, harden SQLite schema upkeep - #173

Merged
amirotin merged 7 commits into
mainfrom
remediation/p9-migration-squash
Jul 7, 2026
Merged

P9: squash migration trees, harden SQLite schema upkeep#173
amirotin merged 7 commits into
mainfrom
remediation/p9-migration-squash

Conversation

@amirotin

@amirotin amirotin commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

P9 — сжатие миграций + ведение SQLite-схемы (финал серии remediation)

Строго последний план серии 2026-07-02. Оба дерева goose-миграций (0001..0058, ~106 файлов) схлопнуты в один 0001_init.sql на диалект; baseline-механизм снесён; migrateguard обезврежен; добавлены линт парности и генератор rebuild-скриптов. 7 коммитов.

Что сделано

  • migrateguard: реестр DestructiveMigrations опустошён. Он ссылался на исчезающую миграцию 0014 — после squash это вечно блокировало бы миграции на свежих непустых БД (checkOne видел бы v14 как «pending» навсегда). Проводка CheckAll сохранена под будущие деструктивные миграции.
  • SQLite squash: 0001_init.sql = дамп sqlite_master свежей БД, смигрированной полным деревом (временный tools/squashtool, в git не попал). Baseline-fast-path (applyBaselineIfFresh) + db/migrations/sqlite/baseline/ + 2 baseline-теста + stress-тест удалены. Diff old/new дампа — пустой.
  • PostgreSQL squash: 0001_init.sql = pg_dump --schema-only с БД, смигрированной полным деревом (одноразовый postgres:18-alpine). sqlc generate — нулевой дифф (главный гейт эквивалентности PG-схемы). Пере-миграция новым деревом → бит-идентичный дамп.
  • Эквивалентность доказана: TestSchemaSyncPostgresMatchesSQLite PASS (squashed PG ↔ squashed SQLite: таблицы/колонки/типы/CHECK/FK/индексы сходятся), sqlc CLEAN, контракт-тесты обоих бэкендов PASS, 46 таблиц в обоих деревьях.
  • Линт парности (migration_parity_lint_test.go): номера 2..58 запрещены (goose молча пропустил бы их на до-squash БД → новые миграции ≥ 0059); один номер = одно изменение в обоих деревьях; dialect-only через маркер. + 5 юнит-тестов правил.
  • Генератор cmd/sqlite-rebuild: crash-safe рецепт пересборки таблицы (BEGIN до DROP, COMMIT после RENAME, PRAGMA вне транзакций) — golden + functional тесты.
  • README db/migrations/README.md + правила нумерации; комментарии с исчезнувшими номерами миграций почищены; backup.go — комментарий про инверсию SchemaVersion-сравнения для до-squash архивов.

Отклонения от плана (обоснованные)

  1. postgres/migrate_test.go TestMigrateGoosePostgres ожидал >= 7 версий — план адаптировал только SQLite-аналог (Task 3), но не PG-аналог. Поправил (ровно 1), как SQLite.
  2. TestScriptFunctional: код теста из плана резал body от strings.Index(script, "PRAGMA"), но слово «PRAGMA» есть в шапке-комментарии раньше реального statement → syntax error. Заякорил на PRAGMA foreign_keys = OFF.
  3. golangci-lint нашёл errcheck (fmt.Sscanfstrconv.Atoi) + 2×gosec G304 (CLI-чтение файла оператором → //nolint:gosec с обоснованием) в новых файлах плана.

Замечания

  • Существующие БД (dev-флот, docker-volumes) остаются рабочими: goose видит версии 1..58 и пропускает 0001. БД, застрявшие на промежуточной версии, нужно пересоздать (pre-prod, допустимо).

Проверки (локально, все выполнены с поднятым Postgres)

  • go build/vet ./... ./cmd/..., gofmt (мои файлы), golangci-lint (storage+cmd) — 0
  • SQLite dump diff / PG dump diff — пустые; sqlc generateCLEAN
  • TestSchemaSyncPostgresMatchesSQLite + контракт-тесты обоих бэкендов — PASS
  • go test ./... — PASS

См. docs/plans/2026-07-02-remediation/plan-9-migration-squash.md (workspace). Полный CI (schema_sync + PG-контракты через service-контейнер) — на ране.

Copilot AI review requested due to automatic review settings July 7, 2026 10:36

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@sonarqubecloud

sonarqubecloud Bot commented Jul 7, 2026

Copy link
Copy Markdown

@amirotin
amirotin merged commit 7efce80 into main Jul 7, 2026
32 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants