web-dev-qa-db-fra.com

Comment convertir Laravel migrations vers des scripts SQL bruts?

Les développeurs de mon équipe sont vraiment habitués à la puissance des migrations Laravel, ils fonctionnent très bien sur les machines locales et nos serveurs de développement . Mais l’administrateur de la base de données du client n’accepte pas les migrations Laravel. Il demande des scripts SQL bruts pour chaque nouvelle version de notre application.

Existe-t-il un outil ou une technique de programmation permettant de capturer le résultat de la migration de Laravel vers des scripts SQL haut/bas?  

Ce serait parfait si nous pouvions intégrer la génération de script SQL dans notre système CI (TeamCity) lors de la création de versions de production.

En passant, nous allons utiliser Laravel 5 et PostgreSQL pour ce projet.

30
JustAMartin

Utilisez la commande migrate

Vous pouvez ajouter l'indicateur --pretend lorsque vous exécutez php artisan migrate pour envoyer les requêtes au terminal:

php artisan migrate --pretend

Cela ressemblera à ceci:

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

Pour sauvegarder ceci dans un fichier, il suffit de rediriger la sortie sans ansi :

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

Cette commande n'inclut que les migrations qui n'ont pas encore été migrées.


Pirater la commande migrate

Pour personnaliser davantage la manière d'obtenir les requêtes, envisagez de pirater la source et créez votre propre commande personnalisée ou quelque chose du genre. Pour vous aider à démarrer, voici un code rapide pour obtenir toutes les migrations.

Exemple de 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);

Exemple de sortie

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

Ce code inclura all les migrations. Pour savoir comment obtenir uniquement ce qui n'est pas déjà migré, jetez un œil à la méthode run() dans vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php.

62
user2479930