it-swarm.com.de

Ausführen einer spezifischen Laravel 4-Migration (einzelne Datei)

Ich möchte keine All Outstanding Migrations auf Laravel 4 ausführen. Ich habe 5 Migrationen. Jetzt möchte ich nur noch eine Migration ausführen. Anstelle von: php artisan migrate Ich möchte eine bestimmte Migration ausführen wie: php artisan migrate MY_MIGRATION_TO_RUN

53
Mamadou

Sieht aus, als würden Sie es falsch machen. 

Migrationen wurden von Laravel nacheinander ausgeführt, in der genauen Reihenfolge, in der sie erstellt wurden, sodass die Ausführung und Reihenfolge der Ausführung nachverfolgt werden kann. Auf diese Weise kann Laravel einen Stapel von Migrationen sicher rückgängig machen, ohne die Datenbank zu beschädigen.

Wenn Sie dem Benutzer die Möglichkeit geben, sie manuell auszuführen, können Sie nicht sicher wissen, wie die Änderungen in Ihrer Datenbank rückgängig gemacht werden.

Wenn Sie wirklich etwas in Ihrer Datenbank ausführen müssen, erstellen Sie ein DDL-Skript, und führen Sie es manuell auf Ihrem Webserver aus. 

Oder erstellen Sie einfach eine neue Migration und führen Sie sie mit einem Handwerker aus.

EDIT: 

Wenn Sie es zuerst ausführen müssen, müssen Sie es zuerst erstellen. 

Wenn Sie sie nur neu anordnen müssen, benennen Sie die Datei um, um die erste zu sein. Migrationen werden mit einer Zeitmarke erstellt:

2013_01_20_221554_table

Um eine neue Migration vor dieser zu erstellen, können Sie sie benennen

2013_01_19_221554_myFirstMigration

Verschieben Sie einfach die bereits ausgeführten Migrationen aus dem Ordner app/config/database/migrations /. Führen Sie dann den Befehl php artisan migrate aus. Arbeitete wie ein Zauber für mich.

36

Ein netter kleiner Ausschnitt, um Ängste zu lindern, wenn Sie Laravel 4-Migrationen php artisan migrate --pretend ausführen. Dadurch wird nur die SQL ausgegeben, die ausgeführt worden wäre, wenn Sie die eigentliche Migration durchgeführt haben.

Das klingt, als wären Ihre ersten 4 Migrationen bereits ausgeführt worden. Ich würde vermuten, dass, wenn Sie php artisan migrate nur die neue, letzte Migration ausführen.

Ratschlag: Stellt sicher, dass alle Ihre Up () - und Down () - Aufgaben so arbeiten, wie Sie es erwarten. Ich laufe gerne hoch (), runter (), hoch (), wenn ich meine Migrationen durchführe, nur um sie zu testen. Es wäre schrecklich für dich, 5-6 Migrationen zu machen und zu realisieren, dass du sie nicht ohne Probleme zurückrollen kannst, weil du das down () nicht mit dem up () 100% -Prozent abgleichst.

Nur meine zwei Cent! Hoffe der --pretend hilft.

22
Erik Aybar

Sie können Migrationen in mehreren Ordnern ablegen und Folgendes ausführen:

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

Die einzige Möglichkeit, eine Migration erneut auszuführen, ist eine schmutzige. Sie müssen Ihre Datenbank öffnen und die Zeile in der Migrationstabelle löschen, die Ihre Migration darstellt.

Führen Sie dann den PHP-Handwerker erneut aus.

15
elfif

Sie können ein separates Verzeichnis für Ihre Migrationen von Ihrem Terminal aus erstellen:

mkdir /database/migrations/my_migrations

Verschieben Sie dann die bestimmte Migration, die Sie ausführen möchten, in dieses Verzeichnis und führen Sie den folgenden Befehl aus:

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

Hoffe das hilft!

4
jidesakin

Ich habe diese Antwort in einem anderen Beitrag gegeben, aber Sie können dies tun: Führen Sie artisan migrate aus, um alle Migrationen auszuführen, und führen Sie die folgenden SQL-Befehle aus, um die Migrationstabelle zu aktualisieren, sodass die Migrationen nacheinander ausgeführt werden:

SET @a = 0;  
UPDATE migrations SET batch = @a:[email protected]+1;

Dadurch wird die Batch-Spalte in 1, 2, 3, 4 usw. geändert. Fügen Sie dort eine WHERE batch>=...-Bedingung hinzu (und aktualisieren Sie den Anfangswert von @a), wenn Sie nur bestimmte Migrationen beeinflussen möchten.

Danach können Sie artisan migrate:rollback so viel wie nötig benötigen, und die Migrationen werden nacheinander durchlaufen.

3
Colin

Ich weiß, dass dies auf eine einfache Weise möglich ist, die nur für local Host verfügbar ist.

  1. Ändern Sie Ihre Migrationsdatei nach Bedarf
  2. Öffnen Sie Ihren phpMyAdmin oder was auch immer Sie verwenden, um Ihre Datenbanktabelle anzuzeigen
  3. finden Sie die gewünschte Tabelle und legen Sie sie ab
  4. migrations-Tabelle finden und öffnen
  5. suchen Sie in dieser Tabelle unter Migrationsfeld den gewünschten Tabellennamen und löschen Sie die Zeile
  6. führen Sie schließlich den Befehl php artisan migrate über Ihre Befehlszeile oder Ihr Terminal aus. Dadurch werden nur die Tabellen migriert, die nicht in der Migrationstabelle in der Datenbank vorhanden sind.

Dieser Weg ist absolut sicher und macht keine Fehler oder Probleme, obwohl er wie ein unprofessioneller Weg aussieht, aber er funktioniert trotzdem einwandfrei.

viel Glück

2
Ahmed Mabrouk

Wenn Sie Ihre neueste Migrationsdatei ausführen möchten, führen Sie folgende Schritte aus:

php artisan migrate

Sie können auch zurückkehren, bevor Sie die Migration mit folgendem hinzugefügt haben:

php artisan migrate: rollback
1
Jammer

Ich habe dasselbe Problem ... Kopiert Tabellenerstellungscodes in die erste Migrationsdatei, etwa wie folgt:

  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();
        });
    }

Sie können auch batch Spaltennummer in migrations Tabelle ändern (verringern);)

Und dann php artisan migrate ausführen.

1
ivahidmontazer

Wenn es nur zu Testzwecken ist, mache ich es so:

Für meinen Fall habe ich mehrere Migrationen, eine davon enthält App-Einstellungen.

Während ich die App teste und nicht alle Migrationen bereits eingerichtet sind, verschiebe ich sie einfach in einen neuen Ordner "Zukunft". Dieses Folde wird von keinem Handwerker berührt und führt nur die gewünschte Migration aus.

Dirty Workaround, aber es funktioniert ...

1
Jan Schuermann

Für alle, die noch daran interessiert sind, Laravel 5 Update: Laravel hat die Option implementiert, eine Migrationsdatei nach der anderen auszuführen Zeit (in Version 5.7).

Sie können dies jetzt ausführen: php artisan migrate --path=/database/migrations/my_migration.php (wie beantwortet hier )

Weil das Illuminate\Database\Migrations\Migrator::getMigrationFiles() jetzt diesen Code enthält: return Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php'); ( siehe den Quellcode . )


Aber in meinem Anwendungsfall wollte ich eigentlich eine Reihe von Migrationen gleichzeitig ausführen , nicht nur eine oder alle .

Also bin ich den Laravel Weg gegangen und habe eine andere Implementierung des Migrators registriert, die entscheidet, welche Dateien verwendet werden sollen:

/**
 * 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();
    }
}

Wir müssen es im Container als 'migrator' registrieren (um als $app['migrator'] erreichbar zu sein), da Migrate auf diese Weise auf das Objekt zugreift, wenn es selbst im IoC registriert wird. Dazu geben wir diesen Code an einen Dienstanbieter weiter (in meinem Fall ist es ein 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);
    }

Dann können Sie dies ausführen:

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

Beachten Sie die mehreren durch Komma getrennten Migrationsdateien.

Es ist getestet und funktioniert in Laravel 5.4 und sollte Laravel 5.8 kompatibel sein.

Warum?

Für alle Interessierten: Der Usecase aktualisiert die Version der Datenbank zusammen mit ihren Daten .

Stellen Sie sich zum Beispiel vor, Sie wollten die Straße und die Hausnummer aller Benutzer in einer neuen Spalte zusammenführen. Nennen wir sie street_and_house. Und stellen Sie sich vor, Sie wollten dies auf sichere und getestete Weise bei mehreren Installationen tun - Sie würden wahrscheinlich ein Skript dafür erstellen (in meinem Fall erstelle ich Befehle zur Datenversionierung - handwerkliche Befehle).

Um eine solche Operation auszuführen, müssen Sie zuerst die Benutzer in den Speicher laden. Führen Sie dann die Migrationen aus, um die alten Spalten zu entfernen und die neuen hinzuzufügen. und dann für jeden Benutzer den street_and_house=$street . " " . $house_no zuweisen und die Benutzer speichern. (Ich vereinfache hier, aber Sie können sich sicherlich andere Szenarien vorstellen)

Und ich möchte mich nicht auf die Tatsache verlassen, dass ich alle Migrationen zu einem bestimmten Zeitpunkt ausführen kann. Stellen Sie sich vor, Sie wollten ein Update von 1.0.0 auf 1.2.0 durchführen, und es gab mehrere Batches solcher Updates. Wenn Sie weitere Migrationen durchführen, können Ihre Daten beschädigt werden, da diese Migrationen von einem eigenen dedizierten Update-Befehl ausgeführt werden müssen. Daher möchte ich nur die ausgewählten bekannten Migrationen ausführen, mit denen dieses Update umgehen kann, dann Vorgänge für die Daten ausführen und möglicherweise den nächsten Befehl zum Aktualisieren von Daten ausführen. (Ich möchte so defensiv wie möglich sein).

Um dies zu erreichen, benötige ich den oben genannten Mechanismus und definiere einen festen Satz von Migrationen, die ausgeführt werden sollen, damit ein solcher Befehl funktioniert.

Hinweis: Ich hätte es vorgezogen, einen einfachen Dekorateur mit der magischen __call -Methode zu verwenden und eine Vererbung zu vermeiden (ein ähnlicher Mechanismus, den Laravel im \Illuminate\Database\Eloquent\Builder verwendet). um den \Illuminate\Database\Query\Builder) zu verpacken, aber der MigrateCommand benötigt leider eine Instanz von Migrator in seinem Konstruktor.


Letzte Anmerkung: Ich wollte diese Antwort auf die Frage posten Wie kann ich eine bestimmte Migration in laravel ausführen? , da es Laravel 5 - spezifisch ist. Aber ich kann nicht - da diese Frage als Duplikat dieser Frage markiert ist (obwohl diese Frage als Laravel 4 markiert ist).

0
Jan Bradáč

Dies ist ein schlechter Ansatz, den ich verwende. Ich lösche andere Migrationsdateien mit Ausnahme der spezifischen Datei, die ich migrieren möchte, und starte dann PHP artisan migrate, nachdem die Migration abgeschlossen ist. Ich gehe in meinen Papierkorb und stelle sie wieder her die gelöschten Dateien

0
israelnojr

Weisen Sie eine Ausnahme in einer Migration aus, wenn Sie sie nicht anwenden möchten, und dies würde den gesamten Migrationsprozess stoppen.

Mit diesem Ansatz können Sie die Migration in mehrere Schritte aufteilen.

0

Ich habe return in Zeile 1 verwendet, damit die vorherigen dbs unverändert bleiben.

<?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');
    }
}

so einfach...! Gehen Sie einfach in Ihren Migrationsordner. Verschieben Sie alle Migrationsdateien in einen anderen Ordner. Geben Sie dann alle Migrationen einzeln in den Migrationsordner zurück und führen Sie die Migration für eine von ihnen aus (PHP Artisan). Wenn Sie eine fehlerhafte Migrationsdatei in den Hauptmigrationsordner einfügen und php artisan migrate in der Eingabeaufforderung ausführen, tritt ein Fehler auf.

0
musllim boy

Sie können folgende Lösung verwenden:

  1. erstellen Sie Ihre Migration.
  2. überprüfen Sie Ihren Migrationsstatus wie folgt: php artisan migrate:status.
  3. kopieren Sie den vollständigen Namen der neuen Migration und gehen Sie wie folgt vor: php artisan migrate:rollback --path:2018_07_13_070910_table_tests.
  4. und dann mache das php artisan migrate.

schließlich migrieren Sie eine bestimmte Tabelle. Viel Glück.