awesome-everything EN
↑ Обратно к восхождению

Базы данных

Что такое миграция схемы и почему она заменяет ad-hoc DDL

Суть Миграция — это версионированный, упорядоченный SQL-скрипт, изменяющий схему БД шаг-в-шаг с кодом приложения, который от неё зависит.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 8 min

Отто хочет добавить колонку phone в таблицу users. Он открывает psql и запускает ALTER TABLE users ADD COLUMN phone TEXT. Три месяца спустя приходит новый инженер, клонирует репозиторий, получает ошибки — в его базе нет колонки phone. Никто не знает, что нужно изменить. Схема разошлась.

Проблема с ad-hoc DDL

Запуск ALTER TABLE напрямую в psql работает один раз, на одной машине, для одного инженера. Как только появляется вторая среда — стейджинг, CI, ноутбук коллеги — схема молча расходится. Никто не отслеживает, что изменилось и когда. Возможность воспроизвести всё заново теряется.

Файл миграции кодирует изменение как именованный, упорядоченный артефакт:

-- migrations/20260514_add_user_phone.sql
ALTER TABLE users ADD COLUMN phone TEXT;

Инструмент миграции записывает, какие файлы были применены, в таблицу schema_migrations. Новый инженер, запустив prisma migrate dev или flyway migrate, получает все ожидающие миграции в правильном порядке. База приходит в одно и то же известное состояние на каждой машине.

Миграции версионируются как коммиты

Git-коммитФайл миграции
Переводит кодовую базу из состояния N в N+1Переводит схему из состояния N в N+1
Упорядочен по timestamp/хешуУпорядочен по версионному префиксу (timestamp или V1/V2)
Применяется один раз; неизменяем после мержаПрименяется один раз на базу; не редактируется после деплоя
Ревьюируется как diff в PRРевьюируется как SQL в PR, проверяется линтером Squawk или Atlas
Воспроизводимо: git clone + история = тот же кодВоспроизводимо: migrate up с нуля = та же схема

Порядок деплоя важен

Схема БД и код приложения, который её использует, должны быть совместимы в каждый момент деплоя — продакшн-трафик не останавливается ради миграции.

Два правила:

  1. Аддитивное изменение (новая колонка, которую читает новый код): запустите миграцию до деплоя кода. Старый код игнорирует новую колонку; новый код находит её готовой.
  2. Удаление (дроп колонки, которую читает старый код): деплойте новый код первым, дождитесь, пока старый код сдренируется, затем запустите миграцию. Иначе старый код запрашивает несуществующую колонку и падает.

Однотранзакционные миграции, удаляющие или переименовывающие колонки за один шаг — классический deploy-coupled баг; фикс — разбить изменения на безопасные аддитивные шаги (урок 05).

Почему это работает

Почему инструменты миграции используют таблицу schema_migrations, а не сравнивают живую схему с желаемой? Diff схем ненадёжен — две схемы могут выглядеть структурно одинаково, при этом иметь разные индексы, constraint’ы или права. Отслеживание применённых файлов миграций проще, аудируемо и выживает при восстановлении базы из бэкапа.

Викторина

Зачем использовать файлы миграций вместо ALTER TABLE напрямую в psql?

Викторина

Миграция добавляет новую колонку, которую читает новый код. Каков правильный порядок деплоя?

Расставь шаги по порядку

Расставьте шаги жизненного цикла продакшн-миграции схемы:

  1. 1 Написать SQL-файл миграции с версионным префиксом (timestamp или V-номер)
  2. 2 Открыть PR: SQL ревьюируется, проверяется Squawk или Atlas CI
  3. 3 Смержить PR — файл миграции теперь в системе контроля версий
  4. 4 CI запускает миграцию на стейджинге; тесты проходят
  5. 5 Миграция запускается в продакшне до деплоя нового кода
  6. 6 Деплоится код приложения, зависящий от изменения схемы
  7. 7 Инструмент миграции записывает файл как применённый в schema_migrations
Закончи аналогию

Заполните пропуск: миграция БД — это для изменений схемы то же, что git ________ для изменений кода — версионированная, упорядоченная, ревьюируемая единица, переводящая систему из состояния N в N+1.

Вспомните перед уходом
  1. 01
    В двух предложениях: что такое миграция схемы и какую проблему она решает по сравнению с ad-hoc DDL?
  2. 02
    Почему порядок деплоя миграции и кода важен и каково правило для аддитивного изменения?
  3. 03
    Что содержит таблица schema_migrations и почему это лучше, чем делать diff схем?
Итог

Миграция — это версионированный SQL-файл, переводящий схему БД из состояния N в N+1 и записываемый в таблицу schema_migrations после применения. Запуск ALTER TABLE ad-hoc работает один раз, но не оставляет истории и молча расходит среды. Инструменты миграций (Prisma Migrate, Flyway, golang-migrate, Atlas) применяют ожидающие файлы по порядку в каждой среде, делая схему всегда воспроизводимой с нуля. Порядок деплоя не опционален: для аддитивных изменений сначала запускайте миграцию, чтобы схема была готова к появлению нового кода.

Связанные уроки
встречается в140
Продолжить восхождение ↑ADD COLUMN: мгновенно в PG 11+ против перезаписи в старом Postgres
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.