Подтвердить что ты не робот

Запуск одной конкретной миграции Laravel (один файл)

Я не хочу запускать все выдающиеся мигранты на laravel 4. У меня 5 миграций. Теперь я просто хочу выполнить одну миграцию.  вместо выполнения: php artisan migrate Я хотел бы выполнить одну конкретную миграцию, например: php artisan migigate MY_MIGRATION_TO_RUN

4b9b3361

Ответ 1

Похоже, вы делаете это неправильно.

Миграции выполнялись Laravel один за другим, в том порядке, в котором они были созданы, поэтому он может отслеживать выполнение и порядок выполнения. Таким образом, Laravel сможет БЕСПЛАТНО откатить пакет миграции, не рискуя сломать вашу базу данных.

Предоставление пользователю возможности выполнять их вручную, не позволяет (точно) узнать, как отменить изменения в вашей базе данных.

Если вам действительно нужно что-то выполнить в своей базе данных, лучше создать DDL script и выполнить его вручную на своем веб-сервере.

Или просто создайте новую миграцию и выполните ее с помощью artisan.

EDIT:

Если вам нужно сначала запустить его, сначала его нужно создать.

Если вам просто нужно переупорядочить их, переименуйте файл первым. Миграции создаются с помощью timestemp:

2013_01_20_221554_table

Чтобы создать новую миграцию до этого, вы можете назвать ее

2013_01_19_221554_myFirstMigration

Ответ 2

Просто переместите уже запущенные миграции из папки app/config/database/migrations/. Затем запустите команду php artisan migrate. Работала как прелесть для меня.

Ответ 3

Вы можете переносить миграцию в другие папки и запускать что-то вроде:

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

Ответ 4

Хороший небольшой фрагмент, чтобы облегчить любые опасения при запуске миграции Laravel 4 php artisan migrate --pretend. Это приведет к выходу SQL, который был бы запущен, если вы выполнили фактическую миграцию.

Похоже, что начальные 4 миграции уже запущены. Я бы предположил, что когда вы php artisan migrate, он выполнит только новую, недавнюю миграцию.

Совет: убедитесь, что все ваши функции up() и down() работают так, как вы ожидаете. Мне нравится запускать(), down(), up(), когда я запускаю свои миграции, чтобы проверить их. Было бы ужасно, если бы вы получили 5-6 переходов и поняли, что не можете откатить их обратно без хлопот, потому что вы не сопоставляете down() с up() 100% процентов.

Просто мои два цента! Надеемся, что --pretend поможет.

Ответ 5

Единственный способ повторной миграции - грязный. Вам нужно открыть свою базу данных и удалить строку в таблице миграции, которая представляет вашу миграцию.

Затем запустите php artisan снова.

Ответ 6

Вы можете создать отдельный каталог для своих миграций с вашего терминала следующим образом:

mkdir /database/migrations/my_migrations

И затем переместите конкретный перенос, который вы хотите запустить в этот каталог, и запустите эту команду:

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

Надеюсь, это поможет!

Ответ 7

Я дал этот ответ на другой пост, но вы можете сделать это: запустите artisan migrate, чтобы запустить все миграции, а затем следующие команды SQL, чтобы обновить таблицу миграций, сделав ее похожей на миграцию, выполняемую по одному за раз

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

Это изменит колонку пакета на 1, 2, 3, 4 и т.д. Добавьте там WHERE batch>=... условие (и обновите начальное значение @a), если вы хотите только повлиять на некоторые миграции.

После этого вы можете artisan migrate:rollback столько, сколько требуется, и он будет проходить через миграции по одному за раз.

Ответ 8

Есть один простой способ, который я знаю, чтобы сделать это можно только для вас только на локальном хосте

  • Модифицировать файл миграции по мере необходимости
  • откройте свой phpMyAdmin или все, что вы используете, чтобы увидеть таблицу своей базы данных.
  • найдите нужную таблицу и отпустите ее
  • найдите таблицу миграции и откройте ее.
  • в этой таблице в поле миграции найдите нужное имя таблицы и удалите ее строку
  • выполните команду php artisan migrate из командной строки или терминала. это приведет только к миграции таблиц, которые не существуют в таблице миграции в базе данных.

Этот способ абсолютно безопасен и не будет делать никаких ошибок или проблем, пока он выглядит непрофессионально, но он все равно отлично работает.

удача

Ответ 9

Если это просто для тестирования, вот как я это делаю:

В моем случае у меня есть несколько миграций, один из которых содержит параметры App-Settings.

Пока я тестирую приложение, а не все миграции уже настроены, я просто перемещаю их в новую папку "будущее". Этот склад не будет затронут мастером, и он выполнит только миграцию, которую вы хотите.

Грязное обходное решение, но оно работает...

Ответ 10

Если вы хотите запустить свой последний файл миграции, вы должны сделать следующее:

php artisan migrate

Вы также можете вернуться назад, прежде чем добавить перенос с помощью:

php artisan migrate: rollback

Ответ 11

У меня такая же проблема. Скопируйте коды создания таблицы в первый файл миграции, как показано ниже:

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

Также вы можете изменить (уменьшить) номер столбца batch в таблице migrations;)

И затем запустите php artisan migrate.

Ответ 12

Бросьте исключение в миграции, если вы не хотите его применять, и это остановит весь процесс миграции.

Используя этот подход, вы можете разбить свою группу миграций на шаги.

Ответ 13

так просто...! просто перейдите в папку переноса. переместите все файлы миграции в другую папку. затем верните все миграции один за другим в папку миграции и выполните миграцию для одного из них (php artisan). когда вы вставляете файл с плохой миграцией в главную папку миграции и запускаете миграцию php artisan в командной строке, будет ошибка.

Ответ 14

Я использовал return в строке 1, поэтому предыдущие базы данных сохраняются как есть.

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

Ответ 15

Это плохой подход, который я использую. Я удаляю другие файлы миграции, кроме конкретного файла, который я хочу перенести, затем запускаю PHP artisan migrate после того, как миграция завершится, я пойду в свою корзину и восстановлю удаленные файлы.

Ответ 16

Для всех, кто еще заинтересован в этом, обновление Laravel 5: Laravel реализовал возможность запуска по одному файлу миграции за раз (в версии 5.7).

Теперь вы можете запустить это: php artisan migrate --path=/database/migrations/my_migration.php (как здесь ответили)

Поскольку Illuminate\Database\Migrations\Migrator::getMigrationFiles() теперь содержит этот код: return Str::endsWith($path, '.php')? [$path]: $this->files->glob($path.'/*_*.php'); return Str::endsWith($path, '.php')? [$path]: $this->files->glob($path.'/*_*.php'); (см. исходный код.)


Но в моем случае я действительно хотел запустить набор миграций одновременно, а не только одну или все.

Поэтому я пошел по пути Laravel и зарегистрировал другую реализацию Migrator, которая решает, какие файлы использовать:

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

Мы должны зарегистрировать его в контейнере как 'migrator' (чтобы он был доступен как $app['migrator']), потому что именно так команда Migrate обращается к нему, когда сама регистрируется в IoC. Для этого мы помещаем этот код в поставщика услуг (в моем случае это 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);
    }

Тогда вы можете запустить это:

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

Обратите внимание на несколько файлов миграции, разделенных запятой.

Он протестирован и работает в Laravel 5.4 и должен быть совместим с Laravel 5.8.

Зачем?

Для всех, кто интересуется: вариант использования обновляет версию базы данных вместе с ее данными.

Представьте, например, что вы хотите объединить улицу и номер дома всех пользователей в новый столбец, назовем его street_and_house. И представьте, что вы хотите сделать это на нескольких установках безопасным и проверенным способом - вы, вероятно, создадите сценарий для этого (в моем случае я создаю команды управления версиями данных - команды ремесленников).

Чтобы выполнить такую операцию, сначала необходимо загрузить пользователей в память; затем запустите миграцию, чтобы удалить старые столбцы и добавить новые; а затем для каждого пользователя назначьте street_and_house=$street. " ". $house_no street_and_house=$street. " ". $house_no street_and_house=$street. " ". $house_no и сохранить пользователей. (Я упрощаю здесь, но вы наверняка можете представить другие сценарии)

И я не хочу полагаться на тот факт, что я могу запустить все миграции в любой момент времени. Представьте, что вы хотите обновить его, скажем, с 1.0.0 до 1.2.0, и было несколько пакетов таких обновлений - выполнение любых других миграций может повредить ваши данные, потому что эти миграции должны обрабатываться их собственной выделенной командой обновления. Поэтому я хочу запустить только выбранные известные миграции, с которыми это обновление знает, как работать, затем выполнить операции с данными, а затем, возможно, выполнить следующую команду обновления данных. (Я хочу быть максимально защитным).

Чтобы достичь этого, мне нужен вышеупомянутый механизм и определить фиксированный набор миграций, которые должны быть выполнены для работы такой команды.

Примечание: я бы предпочел использовать простой декоратор, использующий магический метод __call и избежать наследования (аналогичный механизм, который Laravel использует в \Illuminate\Database\Eloquent\Builder для переноса \Illuminate\Database\Query\Builder), но MigrateCommand сожалению, MigrateCommand требует наличия экземпляра Migrator в его конструкторе.


Последнее замечание: я хотел опубликовать этот ответ на вопрос " Как запустить конкретную миграцию в laravel, так как она специфична для Laravel 5?". Но я не могу - поскольку этот вопрос помечен как дубликат этого (хотя этот вопрос помечен как Laravel 4).

Ответ 17

Вы можете использовать приведенное ниже решение:

  1. создать свою миграцию.
  2. проверьте статус миграции как: php artisan migrate:status.
  3. скопируйте полное имя новой миграции и сделайте следующее: php artisan migrate:rollback --path:2018_07_13_070910_table_tests.
  4. а затем сделайте этот php artisan migrate.

наконец, вы переносите конкретную таблицу. Удачи.

Ответ 18

Вы можете ввести следующую команду:

php artisan migrate --help

...

--path [= PATH] Путь (и) к исполняемым файлам миграции (допускается несколько значений)

...

Если он показывает опцию "--path" (как в верхнем примере), это означает, что ваша версия Laravel поддерживает этот параметр. Если это так, то вам повезло, тогда вы можете напечатать что-то вроде:

php artisan migrate --path =/база данных /migrations/v1.0.0/

Где "v.1.0.0" - это каталог, который существует в вашем каталоге "/database/migrations" и содержит те миграции, которые вы хотите запустить для определенной версии.

Если нет, то вы можете проверить в своей таблице миграций, чтобы увидеть, какие миграции уже были выполнены, например:

SELECT * FROM migrations;

А затем переместите из папки "/database/migrations" те, которые были выполнены. Создав другую папку "/database/execute-migrations" и переместив туда выполненные миграции.

После этого вы сможете выполнить:

php ремесленник мигрировать

Без опасности переопределить любую существующую таблицу в вашей схеме/базе данных.