web-dev-qa-db-fra.com

Exécution d’une migration laravel 4 spécifique (fichier unique)

Je ne veux pas exécuter toutes les migrations exceptionnelles sur laravel 4. J'ai 5 migrations. Maintenant, je veux juste lancer une migration . au lieu de faire: php artisan migrate Je voudrais lancer une migration spécifique comme: php artisan migrate MY_MIGRATION_TO_RUN

53
Mamadou

On dirait que tu le fais mal. 

Les migrations étaient faites pour être exécutées par Laravel une à une, dans l’ordre exact où elles avaient été créées , afin qu’elles puissent suivre l’exécution et l’ordre d’exécution. De cette façon, Laravel sera en mesure d'annuler EN TOUTE SÉCURITÉ un lot de migrations sans risquer de casser votre base de données.

En donnant à l'utilisateur le pouvoir de les exécuter manuellement, il est impossible de savoir (bien sûr) comment annuler les modifications dans votre base de données.

Si vous avez vraiment besoin d'exécuter quelque chose dans votre base de données, créez un script DDL et exécutez-le manuellement sur votre serveur Web. 

Ou tout simplement créer une nouvelle migration et l'exécuter à l'aide d'artisan.

MODIFIER:  

Si vous devez d'abord l'exécuter, vous devez d'abord le créer. 

Si vous avez juste besoin de les réorganiser, renommez le fichier en premier. Les migrations sont créées avec un timestemp:

2013_01_20_221554_table

Pour créer une nouvelle migration avant celle-ci, vous pouvez la nommer.

2013_01_19_221554_myFirstMigration
46

Déplacez simplement les migrations déjà exécutées du dossier app/config/database/migrations /. Ensuite, exécutez la commande php artisan migrate. A fonctionné à merveille pour moi .

36
Pradyumna Challa

Un joli petit bout de code pour calmer les craintes lors de l'exécution de Laravel 4 migrations php artisan migrate --pretend. Cela ne produira que le code SQL qui aurait été exécuté si vous avez exécuté la migration réelle.

Il semble que vos 4 migrations initiales ont déjà été effectuées. Je suppose que lorsque vous php artisan migrate, il ne lancera que la nouvelle migration récente.

Conseil: assurez-vous que tous vos mouvements () et suivants () fonctionnent comme vous le souhaitez. J'aime courir up (), down (), up () quand je lance mes migrations, juste pour les tester. Il serait terrible pour vous d'obtenir 5-6 migrations et de réaliser que vous ne pouvez pas les restaurer sans problème, car vous ne faites pas correspondre le down () au up () à 100%.

Juste mes deux cents! J'espère que le --pretend aide.

22
Erik Aybar

Vous pouvez mettre les migrations dans plus de dossiers et exécuter quelque chose comme:

php artisan migrate --path=/app/database/migrations/my_migrations
18
fico7489

Le seul moyen de relancer une migration est un sale chemin. Vous devez ouvrir votre base de données et supprimer la ligne du tableau des migrations qui représente votre migration.

Puis lancez php artisan migrer à nouveau.

15
elfif

Vous pouvez créer un répertoire distinct pour vos migrations à partir de votre terminal, comme suit:

mkdir /database/migrations/my_migrations

Et déplacez ensuite la migration spécifique que vous voulez exécuter dans ce répertoire et exécutez cette commande:

php artisan migrate --path=/database/migrations/my_migrations

J'espère que cela t'aides!

4
jidesakin

J'ai donné cette réponse dans un autre message, mais vous pouvez le faire: exécutez artisan migrate pour exécuter toutes les migrations, puis les commandes SQL suivantes pour mettre à jour la table des migrations, donnant ainsi l'impression que les migrations ont été exécutées une par une:

SET @a = 0;  
UPDATE migrations SET batch = @a:=@a+1;

Cela changera la colonne de lot à 1, 2, 3, 4, etc., etc. Ajoutez une condition WHERE batch>=... dessus (et mettez à jour la valeur initiale de @a) si vous souhaitez uniquement affecter certaines migrations.

Après cela, vous pouvez artisan migrate:rollback autant que nécessaire, et il parcourra les migrations une par une.

3
Colin

Il existe un moyen simple, je sais, de le faire, il ne peut être disponible que sur hôte local

  1. Modifiez votre fichier de migration au besoin
  2. ouvrez votre phpMyAdmin ou ce que vous utilisez pour voir votre table de base de données
  3. trouvez la table désirée et déposez-la
  4. trouver la table des migrations et l'ouvrir
  5. dans cette table sous le champ de migration, trouvez le nom de votre table souhaitée et supprimez sa ligne
  6. enfin, exécutez la commande php artisan migrate à partir de votre ligne de commande ou de votre terminal. cela ne fera que migrer les tables qui n'existent pas dans la table des migrations dans la base de données.

Cette méthode est totalement sûre et ne causera aucune erreur ni problème tant que cela ressemble à une manière non professionnelle, mais cela fonctionne toujours parfaitement.

bonne chance

2
Ahmed Mabrouk

Si vous souhaitez exécuter votre dernier fichier de migration, procédez comme suit:

php artisan migrate

Vous pouvez également revenir à avant d'ajouter la migration avec:

php artisan migrate: rollback
1
Jammer

J'ai le même problème . Copier les codes de création de table dans le premier fichier de migration comme ci-dessous:

  public function up()
    {
        Schema::create('posts', function(Blueprint $table){
            $table->increments('id');
            // Other columns...
            $table->timestamps();
        });
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            // Other columns...
            $table->softDeletes()->nullable();
        });
    }

Vous pouvez aussi changer (diminuer) le numéro de colonne batch dans la table migrations;)

Et puis exécutez php artisan migrate.

1
ivahidmontazer

Si c'est juste à des fins de test, voici comment je le fais:

Pour mon cas, j'ai plusieurs migrations, l'une d'entre elles contient App-Settings.

Pendant que je teste l'application et que toutes les migrations ne sont pas déjà configurées, je les déplace simplement dans un nouveau dossier "futur". Ce pli ne sera pas touché par les artisans et n'exécutera que la migration souhaitée.

Solution de contournement sale, mais ça marche ...

1
Jan Schuermann

Pour ceux qui sont toujours intéressés par ceci, Laravel 5 update: Laravel a implémenté l'option permettant d'exécuter un fichier de migration à la fois. heure (dans la version 5.7).

Vous pouvez maintenant exécuter ceci: php artisan migrate --path=/database/migrations/my_migration.php (comme répondu ici )

Parce que la Illuminate\Database\Migrations\Migrator::getMigrationFiles() contient maintenant ce code: return Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php'); (, voyez le code source . )


Mais dans mon cas d'utilisation, je voulais réellement exécuter un ensemble de migrations en même temps, pas seulement une ou toutes .

Alors je suis allé dans le sens Laravel et j'ai enregistré une implémentation différente du Migrator, qui décide des fichiers à utiliser:

/**
 * A migrator that can run multiple specifically chosen migrations.
 */
class MigrationsSetEnabledMigrator extends Migrator
{
    /**
     * @param Migrator $migrator
     */
    public function __construct(Migrator $migrator)
    {
        parent::__construct($migrator->repository, $migrator->resolver, $migrator->files);

        // Compatibility with versions >= 5.8
        if (isset($migrator->events)) {
            $this->events = $migrator->events;
        }
    }

    /**
     * Get all of the migration files in a given path.
     *
     * @param  string|array $paths
     * @return array
     */
    public function getMigrationFiles($paths)
    {
        return Collection::make($paths)->flatMap(function ($path) {
            return Str::endsWith($path, ']') ? $this->parseArrayOfPaths($path) :
                (Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path . '/*_*.php'));
        })->filter()->sortBy(function ($file) {
            return $this->getMigrationName($file);
        })->values()->keyBy(function ($file) {
            return $this->getMigrationName($file);
        })->all();
    }

    public function parseArrayOfPaths($path)
    {
        $prefix = explode('[', $path)[0];
        $filePaths = explode('[', $path)[1];
        $filePaths = rtrim($filePaths, ']');

        return Collection::make(explode(',', $filePaths))->map(function ($filePath) use ($prefix) {
            return $prefix . $filePath;
        })->all();
    }
}

Nous devons l'enregistrer dans le conteneur sous le nom 'migrator' (pour être accessible en tant que $app['migrator']), car c'est ainsi que la commande Migrate y accède lorsqu'elle est elle-même enregistrée dans l'IoC. Pour ce faire, nous avons mis ce code dans un fournisseur de service (dans mon cas, il s'agit d'un DatabaseServiceProvider):

    public function register()
    {
        $this->app->extend('migrator', function ($migrator, $app) {
            return new MultipleSpecificMigrationsEnabledMigrator($migrator);
        });

        // We reset the command.migrate bind, which uses the migrator - to 
        // force refresh of the migrator instance.
        $this->app->instance('command.migrate', null);
    }

Ensuite, vous pouvez exécuter ceci:

php artisan migrate --path=[database/migrations/my_migration.php,database/migrations/another_migration.php]

Notez les multiples fichiers de migration, séparés par une virgule.

Il est testé et fonctionne dans Laravel 5.4 et devrait être compatible Laravel 5.8.

Pourquoi?

Pour les personnes intéressées: le cas d'utilisation est mettre à jour la version de la base de données avec ses données .

Imaginez, par exemple, que vous vouliez fusionner la rue et le numéro de rue de tous les utilisateurs dans une nouvelle colonne, appelons-le street_and_house. Et imaginez que vous vouliez le faire sur plusieurs installations de manière sécurisée et testée - vous créeriez probablement un script pour cela (dans mon cas, je crée des commandes de gestion des versions de données - des commandes artisanales).

Pour effectuer une telle opération, vous devez d’abord charger les utilisateurs en mémoire; Ensuite, lancez les migrations pour supprimer les anciennes colonnes et ajouter la nouvelle. puis, pour chaque utilisateur, attribuez le street_and_house=$street . " " . $house_no et enregistrez les utilisateurs. (Je simplifie ici, mais vous pouvez sûrement imaginer d'autres scénarios)

Et je ne veux pas compter sur le fait que je peux exécuter toutes les migrations à un moment donné. Imaginez que vous vouliez le mettre à jour de 1.0.0 à 1.2.0 et que plusieurs mises à jour de ce type étaient mises à jour. Effectuer d'autres migrations risquerait de casser vos données car ces migrations devaient être gérées par leur propre commande de mise à jour dédiée. Par conséquent, je souhaite uniquement exécuter les migrations connues sélectionnées avec lesquelles cette mise à jour sait travailler, puis effectuer des opérations sur les données, puis éventuellement exécuter la commande de mise à jour suivante. (Je veux être aussi sur la défensive que possible).

Pour ce faire, j'ai besoin du mécanisme susmentionné et je définis un ensemble fixe de migrations à exécuter pour qu'une telle commande fonctionne.

Remarque: j'aurais préféré utiliser un simple décorateur utilisant la méthode magique __call et éviter l'héritage (mécanisme similaire à celui utilisé par Laravel dans le \Illuminate\Database\Eloquent\Builder pour envelopper le \Illuminate\Database\Query\Builder), mais le MigrateCommand nécessite malheureusement une instance de Migrator dans son constructeur.


Note finale: Je voulais poster cette réponse à la question Comment puis-je exécuter une migration spécifique dans laravel , car il s'agit de Laravel 5 - spécifique. Mais je ne peux pas - puisque cette question est marquée comme une copie de celle-ci (bien que celle-ci porte la mention Laravel 4).

0
Jan Bradáč

C’est une mauvaise approche que j’utilise. Je supprime d’autres fichiers de migration, à l’exception du fichier spécifique que je souhaite migrer, puis je lance PHP une migration artisanale une fois la migration terminée. Je vais aller dans la corbeille et le restaurer. les fichiers supprimés

0
israelnojr

Lancer une exception dans une migration, si vous ne voulez pas l'appliquer, cela arrêterait tout le processus de migration.

En utilisant cette approche, vous pouvez diviser votre groupe de migration en étapes.

0
Yevgeniy Afanasyev

J'ai utilisé return sur la ligne 1 pour que les dbs précédents soient conservés tels quels.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        return;  // This Line
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 50);
            $table->string('slug', 50)->unique();
            $table->integer('role_id')->default(1);
            $table->string('email', 50)->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('mobile', 10)->unique();
            $table->timestamp('mobile_verified_at')->nullable();
            $table->text('password');
            $table->integer('can_login')->default(1);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        return;// This Line
        Schema::dropIfExists('users');
    }
}
0
Alaksandar Jesus Gene

si simple...! Allez simplement dans votre dossier de migration. déplacez tous les fichiers de migration dans un autre dossier. puis retournez toutes les migrations une par une dans le dossier de migration et lancez la migration pour l’un d’eux (php artisan). lorsque vous insérez un fichier de migration incorrect dans le dossier de migration principal et exécutez la migration php artisan dans la commande, l'invite entraîne une erreur.

0
musllim boy

Vous pouvez utiliser la solution ci-dessous:

  1. créez votre migration.
  2. vérifiez l'état de votre migration comme suit: php artisan migrate:status.
  3. copiez le nom complet de la nouvelle migration et procédez comme suit: php artisan migrate:rollback --path:2018_07_13_070910_table_tests.
  4. puis faites ceci php artisan migrate.

enfin, vous migrez une table spécifique. Bonne chance.

0