utilizar una migraciones generar existente datos cómo con sql laravel laravel-migrations

una - ¿Cómo convertir las migraciones de Laravel a scripts de SQL en bruto?



laravel con base de datos existente (2)

Usa el comando migrar

Puede agregar el indicador --pretend cuando ejecute php artisan migrate para enviar las consultas al terminal:

php artisan migrate --pretend

Esto se verá algo como esto:

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

Para guardar esto en un archivo, simplemente redirija la salida sin ansi :

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

Este comando solo incluye las migraciones que aún no se han migrado.

Hackear el comando migrar

Para personalizar aún más cómo obtener las consultas, considere piratear la fuente y hacer su propio comando personalizado o algo así. Para comenzar, aquí hay un código rápido para obtener todas las migraciones.

Código de ejemplo

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

Ejemplo de salida

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

Este código incluirá todas las migraciones. Para ver cómo obtener solo lo que no se ha migrado, eche un vistazo al método run() en vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php .

Los desarrolladores de mi equipo están realmente acostumbrados al poder de las migraciones de Laravel, están funcionando muy bien en las máquinas locales y en nuestros servidores de desarrollo. Pero el administrador de la base de datos del cliente no aceptará las migraciones de Laravel. Solicita los scripts de SQL sin procesar para cada nueva versión de nuestra aplicación.

¿Existe alguna herramienta o técnica de programación para capturar el resultado de las migraciones de Laravel a scripts de SQL arriba / abajo?

Sería perfecto si pudiéramos integrar la generación de secuencias de comandos SQL en nuestro sistema CI (TeamCity) al crear compilaciones de producción.

Por cierto, usaremos Laravel 5 y PostgreSQL para este proyecto.


En caso de que estés enfrentando el mismo problema que yo:

php artisan migrate --pretend

no generó nada, pero ejecuta los SQL sin agregar el registro a las migraciones. En otras palabras,

  • hace el trabajo de SQL, que no fue pensado
  • No devolví nada, por lo que hice la llamada y
  • No agregué la entrada a las migraciones, lo que destruye las situaciones porque no pude volver a ejecutar la migración sin eliminar las tablas manualmente.

El motivo fue mi configuración con varias bases de datos, que se abordan con

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

Puede encontrar más información sobre este tema aquí: https://github.com/laravel/framework/issues/13431

Lamentablemente, un desarrollador de Laravel cerró el problema, cita "El cierre ya que el problema parece ser un caso de ventaja excepcional que se puede resolver con una solución alternativa ", por lo que no hay mucha esperanza, se solucionará en el corto plazo. Para mi caso, tal vez raro, usaré un verificador de diferencias de SQL de terceros.

Aclamaciones