52

私のチームの開発者は、Laravel の移行機能に慣れており、ローカル マシンと開発サーバーでうまく機能しています。しかし、顧客のデータベース管理者は Laravel の移行を受け入れません。彼は、アプリケーションの新しいバージョンごとに未加工の SQL スクリプトを要求します。

Laravel の移行からアップ/ダウン SQL スクリプトへの出力をキャプチャするツールまたはプログラミング手法はありますか?

本番ビルドを作成するときに、SQL スクリプト生成を CI システム (TeamCity) に統合できれば完璧です。

ちなみに、このプロジェクトでは Laravel 5 と PostgreSQL を使用します。

4

5 に答える 5

120

移行コマンドを使用する

--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

于 2015-07-07T08:41:38.017 に答える
1

user2479930 のコードは素晴らしいですが、次のようになりました。

Class 'LocalItemsSchema.php' not found

問題をデバッグし、次のように修正しました。

foreach($migrations as $migration) {
        $migration_name = $migration;
        $migration_name = str_replace('.php', '', $migration_name);
        $migration = $migrator->resolve($migration_name);

        $queries[] = [
            'name' => $migration_name,
            'queries' => array_column($db->pretend(function() use ($migration) { $migration->up(); }), 'query'),
        ];
    }
于 2019-06-15T20:51:47.267 に答える
0

Laravel 6.X を使用しています。私にとって、@ user2479930の答えはうまくいきませんでした。Migrator のソース コードを読み、次を追加する必要がありました$migrator->requireFiles($migrations);

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

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

    $queries[] = [
        'name' => $migration_name,
        'queries' => array_column($db->pretend(function () use ($migration) {
            $migration->up();
        }), 'query'),
    ];
}
dd($queries);
于 2020-01-20T08:20:02.537 に答える