How to convert Laravel migrations to raw SQL scripts?

后端 未结 5 1564
孤独总比滥情好
孤独总比滥情好 2021-01-30 03:33

Developers of my team are really used to the power of Laravel migrations, they are working great on local machines and our dev servers. But customer\'s database admin will not a

5条回答
  •  天命终不由人
    2021-01-30 03:53

    Use the migrate command

    You can add the --pretend flag when you run php artisan migrate to output the queries to the terminal:

    php artisan migrate --pretend
    

    This will look something like this:

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

    To save this to a file, just redirect the output without ansi:

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

    This command only include the migrations that hasn't been migrated yet.


    Hack the migrate command

    To further customize how to get the queries, consider hacking the source and make your own custom command or something like that. To get you started, here is some quick code to get all the migrations.

    Example code

    $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);
    

    Example output

    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")"
        ]
      ]
    ]
    

    This code will include all the migrations. To see how to only get what isn't already migrated take a look at the run() method in vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php.

提交回复
热议问题