Что такое миграция базы данных (Database Migration)?

Ответ

Миграция базы данных — это практика управления изменениями схемы БД (структуры таблиц, индексов, данных) с помощью версионируемых и обратимых скриптов. Это позволяет безопасно и согласованно применять изменения в различных окружениях (разработка, тестирование, продакшн).

Ключевые концепции:

  • Версионирование: Каждая миграция имеет уникальный идентификатор (обычно временная метка или последовательный номер), что позволяет точно знать, какое состояние у БД.
  • Повторяемость: Скрипт миграции должен быть идемпотентным или работать в рамках системы, которая отслеживает применённые миграции, чтобы их нельзя было применить дважды.
  • Обратимость: У каждой миграции есть методы up (применить изменение) и down (откатить изменение). Это критически важно для отладки и отката неудачных релизов.

Пример миграции для создания таблицы в Laravel:

// database/migrations/2023_10_27_000001_create_users_table.php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

return new class extends Migration
{
    // Метод для применения миграции
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // Первичный ключ bigint unsigned, auto_increment
            $table->string('name', 100); // VARCHAR(100)
            $table->string('email')->unique(); // VARCHAR(255) с уникальным индексом
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken(); // Для системы "запомнить меня"
            $table->timestamps(); // Создаёт created_at и updated_at (TIMESTAMP)
        });

        // Можно добавить отдельные индексы или ограничения
        // Schema::table('users', function (Blueprint $table) {
        //     $table->index(['name', 'email']);
        // });
    }

    // Метод для отката миграции
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

Рабочий процесс и инструменты:

  1. Создание: php artisan make:migration create_users_table.
  2. Запуск: php artisan migrate — применяет все неприменённые миграции.
  3. Откат: php artisan migrate:rollback — откатывает последний пакет миграций.
  4. Статус: php artisan migrate:status — показывает, какие миграции применены.

Интеграция в CI/CD: Миграции автоматически выполняются в пайплайне сборки или деплоя, что гарантирует, что схема БД в продакшене всегда соответствует требованиям кода. Это устраняет ручные правки SQL и связанные с ними человеческие ошибки.

Ответ 18+ 🔞

Давай я тебе на пальцах объясню, что это за зверь такой — миграции баз данных. Представь, что твоя база — это квартира. Сначала у тебя одна комната, стол, стул. Потом ты женился, родился ребёнок, теща приехала — надо перепланировку делать, стену ломать, пристройку делать. Так вот, миграции — это и есть чертежи на каждую такую переделку, причём с подробной инструкцией, как стену сломать (метод up) и как её обратно из говна и палок слепить, если теща всё-таки уедет (метод down).

Суть, если по-простому:

  • Версионирование: Это как сериал. У каждой серии (миграции) свой номер и порядок. Нельзя посмотреть 5-ю серию, не увидев первые четыре, иначе нихуя не понятно будет, почему главный герой вдруг с рогами. Так и с базой — нужно знать, в каком она состоянии.
  • Повторяемость: Скрипт должен быть таким, чтобы его можно было запустить сто раз, а результат был как от одного. Или, что чаще, система сама запоминает: «О, эту хуйню мы уже делали, давай следующую».
  • Обратимость: Это святое! Это твоя страховка от пиздеца. Накатил какую-то дичь, всё сломал — одна команда, и ты откатился назад, как будто ничего и не было. Без этого жить страшно, доверия ебать ноль ко всем изменениям.

Вот смотри, как это выглядит в Laravel, например:

// database/migrations/2023_10_27_000001_create_users_table.php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

return new class extends Migration
{
    // Метод, когда мы строим стену (создаём таблицу)
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id(); // Главный ID, большой и неповторимый
            $table->string('name', 100); // Имя, ну строка, чо
            $table->string('email')->unique(); // Почта, и чтоб одна такая была, без повторов
            $table->timestamp('email_verified_at')->nullable(); // Когда подтвердил, а может, и нет
            $table->string('password'); // Пароль, храни, сука, в хэше!
            $table->rememberToken(); // Волшебный токен для кнопки «запомнить меня»
            $table->timestamps(); // Автоматом ставит даты создания и обновления — красота!
        });
    }

    // Метод, когда теща уехала и мы всё сносим к хуям
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

Как с этим работать, не сломав себе всё:

  1. Создал: php artisan make:migration create_users_table. Артизан тебе файлик заготовит.
  2. Запустил: php artisan migrate. Система берёт все неприменённые миграции и накатывает их по порядку. Сиди, смотри, пей чай.
  3. Обосрался? php artisan migrate:rollback. Откатывает последнюю пачку миграций назад. Спасение.
  4. Что вообще происходит? php artisan migrate:status. Покажет тебе список — что применено, что нет. Чтобы не гадать на кофейной гуще.

Зачем это всё в больших проектах? А чтобы не было вот этого: «Вася, срочно на прод-сервере в phpMyAdmin выполни вот этот SQL, только осторожно, там удаление». Это путь в ад, ёпта. В нормальном пайплайне CI/CD миграции запускаются автоматом при деплое. Код поехал — база сама под него подстроилась. Никаких ручных правок, никаких «ой, я забыл». Красота, одним словом. Без этого — пидарас шерстяной, а не разработчик.