Я не хочу запускать все выдающиеся мигранты на laravel 4. У меня 5 миграций. Теперь я просто хочу выполнить одну миграцию. вместо выполнения: php artisan migrate Я хотел бы выполнить одну конкретную миграцию, например: php artisan migigate MY_MIGRATION_TO_RUN
Запуск одной конкретной миграции Laravel (один файл)
Ответ 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
Вы можете использовать приведенное ниже решение:
- создать свою миграцию.
- проверьте статус миграции как:
php artisan migrate:status
. - скопируйте полное имя новой миграции и сделайте следующее:
php artisan migrate:rollback --path:2018_07_13_070910_table_tests
. - а затем сделайте этот
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 ремесленник мигрировать
Без опасности переопределить любую существующую таблицу в вашей схеме/базе данных.