Как преобразовать миграции Laravel в сценарии raw SQL?

разработчики моей команды действительно привыкли к силе миграции Laravel, они отлично работают на локальных машинах и наших серверах dev. Но администратор базы данных клиента не будет принимать миграции Laravel. Он запрашивает сценарии raw SQL для каждой новой версии нашего приложения.

есть ли какой-либо инструмент или метод программирования для захвата вывода из миграции Laravel в сценарии SQL up/down?

было бы идеально, если бы мы могли интегрировать SQL генерация скриптов в нашей системе CI (TeamCity) при создании производственных сборок.

кстати, мы будем использовать Laravel 5 и PostgreSQL для этого проекта.

2 ответов


используйте команду migrate

вы можете добавить --pretend флаг при запуске php artisan migrate для вывода запросов на терминал:

php artisan migrate --pretend

это будет выглядеть так:

Migration table created successfully.
CreateUsersTable: create table "users" ("id" integer not null primary key autoincrement, "name" varchar not null, "email" varchar not null, "password" varchar not null, "remember_token" varchar null, "created_at" datetime not null, "updated_at" datetime not null)
CreateUsersTable: create unique index users_email_unique on "users" ("email")
CreatePasswordResetsTable: create table "password_resets" ("email" varchar not null, "token" varchar not null, "created_at" datetime not null)
CreatePasswordResetsTable: create index password_resets_email_index on "password_resets" ("email")
CreatePasswordResetsTable: create index password_resets_token_index on "password_resets" ("token")

чтобы сохранить это в файл, просто перенаправьте вывод без стандарта ANSI:

php artisan migrate --pretend --no-ansi > migrate.sql

эта команда включает только миграции, которые еще не были перенесены.


взломать миграции команда

чтобы дополнительно настроить, как получить запросы, рассмотрите возможность взлома источника и сделайте свою собственную команду или что-то в этом роде. Чтобы вы начали, вот быстрый код, чтобы получить все миграции.

пример кода

$migrator = app('migrator');
$db = $migrator->resolveConnection(null);
$migrations = $migrator->getMigrationFiles('database/migrations');
$queries = [];

foreach($migrations as $migration) {
    $migration_name = $migration;
    $migration = $migrator->resolve($migration);

    $queries[] = [
        'name' => $migration_name,
        'queries' => array_column($db->pretend(function() use ($migration) { $migration->up(); }), 'query'),
    ];
}

dd($queries);

пример вывода

array:2 [
  0 => array:2 [
    "name" => "2014_10_12_000000_create_users_table"
    "queries" => array:2 [
      0 => "create table "users" ("id" integer not null primary key autoincrement, "name" varchar not null, "email" varchar not null, "password" varchar not null, "remember_token" varchar null, "created_at" datetime not null, "updated_at" datetime not null)"
      1 => "create unique index users_email_unique on "users" ("email")"
    ]
  ]
  1 => array:2 [
    "name" => "2014_10_12_100000_create_password_resets_table"
    "queries" => array:3 [
      0 => "create table "password_resets" ("email" varchar not null, "token" varchar not null, "created_at" datetime not null)"
      1 => "create index password_resets_email_index on "password_resets" ("email")"
      2 => "create index password_resets_token_index on "password_resets" ("token")"
    ]
  ]
]

этот код будет включать в себя все кочевок. Чтобы узнать, как получить только то, что еще не перенесено, взгляните на run() метод vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php.


на всякий случай, если вы столкнулись с той же проблемой, что и я:

php artisan migrate --pretend

ничего не выводил, но запускает SQLs без добавления записи в миграции. Другими словами,

  • он выполняет задание SQL, которое не было предназначено
  • ничего не ответил, поэтому я и позвонил и
  • не добавлял запись в миграции, которая вроде бы разрушает ситуации, поскольку я не смог повторно запустить миграцию без вручную удалить таблицы

причиной этого была моя настройка с несколькими базами данных, которые адресованы с

Schema::connection('master')->create('...

подробнее по этому вопросу вы можете найти здесь: https://github.com/laravel/framework/issues/13431

к сожалению, разработчик Laravel закрыл вопрос, Цитата"закрытие, поскольку проблема кажется редким случаем edge, который можно решить с помощью обходного пути.", так что нет большой надежды, это будет исправьте в ближайшее время. Для моего, возможно, редкого случая я буду использовать стороннюю проверку SQL diff.

Ура