Как преобразовать миграции 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.
Ура