如何将Laravel迁移转换为原始SQL脚本?

Jus*_*tin 34 sql laravel laravel-migrations

我的团队的开发人员已经习惯了Laravel迁移的强大功能,他们在本地计算机和我们的开发服务器上工作得很好.但客户的数据库管理员不接受Laravel迁移.他为每个新版本的应用程序请求原始SQL脚本.

是否有任何工具或编程技术可以将Laravel迁移的输出捕获到上/下SQL脚本?

如果我们可以在创建生产构建时将SQL脚本生成集成到CI系统(TeamCity)中,那将是完美的.

顺便说一句,我们将在这个项目中使用Laravel 5和PostgreSQL.

use*_*930 77

使用migrate命令

您可以--pretend在运行时添加标志php artisan migrate以将查询输出到终端:

php artisan migrate --pretend
Run Code Online (Sandbox Code Playgroud)

这看起来像这样:

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")
Run Code Online (Sandbox Code Playgroud)

要将其保存到文件,只需重定向输出而不用ansi:

php artisan migrate --pretend --no-ansi > migrate.sql
Run Code Online (Sandbox Code Playgroud)

此命令仅包括尚未迁移的迁移.


破解迁移命令

要进一步自定义如何获取查询,请考虑入侵源代码并制作自己的自定义命令或类似的东西.为了帮助您入门,这里有一些快速代码来获取所有迁移.

示例代码

$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);
Run Code Online (Sandbox Code Playgroud)

示例输出

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 Code Online (Sandbox Code Playgroud)

此代码将包括所有迁移.要了解如何仅获取尚未迁移的内容,请查看该run()方法vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php.


and*_*79h 5

以防万一您遇到和我一样的问题:

php artisan migrate --pretend

没有输出任何内容,但运行 SQL 而不将记录添加到迁移中。换句话说,

  • 它完成了 SQL 工作,这不是我们想要的
  • 什么也没返回,这就是我打电话的原因
  • 没有将条目添加到迁移中,这会破坏这种情况,因为我无法在不手动删除表的情况下重新运行迁移

其原因是我设置了多个数据库,这些数据库通过

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

有关该问题的更多信息,您可以在这里找到: https ://github.com/laravel/framework/issues/13431

可悲的是,一位 Laravel 开发人员关闭了该问题,并引用“关闭,因为该问题似乎是一种罕见的边缘情况,可以通过解决方法来解决。 ”,所以希望不大,它很快就会得到修复。对于我可能罕见的情况,我将使用第三方 SQL 差异检查器。

干杯