87

我不想在 laravel 4 上运行所有未完成的迁移。我有 5 个迁移。现在我只想运行一次迁移。而不是这样做: php artisan migrate 我想运行一个特定的迁移,例如: php artisan migrate MY_MIGRATION_TO_RUN

4

20 回答 20

55

看起来你做错了。

迁移是由 Laravel以它们创建的确切顺序一一执行的,因此它可以跟踪执行和执行顺序。这样,Laravel 将能够安全地回滚一批迁移,而不会有破坏数据库的风险。

赋予用户手动执行它们的权力,使用户无法(肯定地)知道如何回滚数据库中的更改。

如果你真的需要在你的数据库中执行某些东西,你最好创建一个 DDL 脚本并在你的网络服务器上手动执行它。

或者只是创建一个新的迁移并使用工匠执行它。

编辑:

如果你需要先运行它,你需要先创建它。

如果您只需要重新排序它们,请将文件重命名为第一个。迁移是使用时间创建的:

2013_01_20_221554_table

要在此之前创建一个新迁移,您可以将其命名

2013_01_19_221554_myFirstMigration
于 2013-09-30T19:45:44.167 回答
55

您可以将迁移放在更多文件夹中并运行以下内容:

php artisan migrate --path=/app/database/migrations/my_migrations
于 2016-02-27T09:59:27.353 回答
41

只需将已运行的迁移移出 app/config/database/migrations/ 文件夹即可。然后运行命令php artisan migrate。对我来说就像一个魅力。

于 2014-02-04T16:21:49.343 回答
27

运行 Laravel 4 迁移时缓解任何恐惧的一个不错的小片段php artisan migrate --pretend。如果您运行实际迁移,这只会输出本应运行的 SQL。

听起来您最初的 4 次迁移已经运行。我猜想当你php artisan migrate它只会运行新的、最近的迁移。

忠告:确保你所有的 up() 和 down() 都按照你的预期工作。我喜欢在运行迁移时运行 up()、down()、up(),只是为了测试它们。进行 5-6 次迁移并意识到无法轻松回滚它们会很糟糕,因为您没有将 down() 与 up() 100% 匹配。

只是我的两分钱!希望有--pretend帮助。

于 2013-12-24T16:01:58.190 回答
17

重新运行迁移的唯一方法是肮脏的。您需要打开数据库并删除迁移表中代表您的迁移的行。

然后再次运行 php artisan migrate。

于 2014-02-04T15:33:25.770 回答
8

您可以从终端为您的迁移创建一个单独的目录,如下所示:

mkdir /database/migrations/my_migrations

然后将要运行的特定迁移移动到该目录并运行以下命令:

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

希望这可以帮助!

于 2017-09-04T17:19:28.557 回答
5

如果您想在 Laravel 中运行(单个文件)迁移,您可以执行以下操作:

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

例如。

C:\xampp\htdocs\laravelv3s>php artisan migrate --path=/database/migrations/2020_02_14_102647_create_blogs_table.php
于 2020-02-14T10:45:03.290 回答
4

我在另一篇文章中给出了这个答案,但您可以这样做:运行artisan migrate以运行所有迁移,然后使用以下 SQL 命令更新迁移表,使其看起来像一次运行一个迁移:

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

这会将批处理列更改为 1、2、3、4 .. 等。如果您只想影响某些迁移,请WHERE batch>=...在此处添加一个条件(并更新 的初始值)。@a

在此之后,您可以artisan migrate:rollback根据需要进行尽可能多的操作,它会一步一步完成迁移。

于 2015-08-27T16:23:02.827 回答
3

您可以使用以下解决方案:

  1. 创建您的迁移。
  2. 检查您的迁移状态,例如:php artisan migrate:status
  3. 复制新迁移的全名并执行以下操作:php artisan migrate:rollback --path:2018_07_13_070910_table_tests.
  4. 然后这样做php artisan migrate

最后,您迁移特定的表。祝你好运。

于 2019-07-13T07:24:28.987 回答
2

如果要运行最新的迁移文件,可以执行以下操作:

php artisan migrate

您还可以使用以下命令恢复到添加迁移之前:

php artisan migrate: rollback
于 2015-12-18T16:25:00.420 回答
2

我知道有一种简单的方法只能在本地主机上为您提供

  1. 根据需要修改您的迁移文件
  2. 打开你的 phpMyAdmin 或任何你用来查看数据库表的东西
  3. 找到所需的表并将其删除
  4. 找到迁移表并打开它
  5. 在迁移字段下的此表中找到所需的表名并删除其行
  6. 最后从命令行php artisan migrate或终端运行命令。这只会迁移数据库中迁移表中不存在的表。

这种方式是完全安全的,不会出现任何错误或问题,虽然它看起来像不专业的方式,但它仍然可以完美运行。

祝你好运

于 2017-07-25T13:22:48.120 回答
1

如果只是为了测试目的,我就是这样做的:

就我而言,我有几个迁移,其中一个包含应用程序设置。

虽然我正在测试应用程序并且并非所有迁移都已设置好,但我只需将它们移动到“未来”的新文件夹中。工匠不会触及此折叠,它只会执行您想要的迁移。

肮脏的解决方法,但它有效......

于 2015-07-05T09:13:44.343 回答
1

如果您不想应用它,则在迁移中抛出异常,它将停止整个迁移过程。

使用这种方法,您可以将一堆迁移拆分为多个步骤。

于 2017-04-26T05:49:29.870 回答
1

我有同样的问题。在第一个迁移文件中复制表创建代码,如下所示:

  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

于 2016-10-13T17:33:27.173 回答
0

这是我使用的一种不好的方法。我将删除除我要迁移的特定文件之外的其他迁移文件,然后在迁移完成后运行 PHP artisan migrate 我将转到我的垃圾箱并恢复已删除的文件

于 2019-05-20T14:57:23.837 回答
0

对于仍然对此感兴趣的任何人,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');代码


但在我的用例中,我实际上想同时运行一组迁移,而不仅仅是一个或全部.

所以我采用了 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 时访问它的方式。为此,我们将此代码放入服务提供者(在我的例子中,它是 a 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并保存用户。(我在这里简化,但你肯定可以想象其他场景)

而且我不想依赖于我可以在任何给定时间运行所有迁移的事实。想象一下,您想将它从 1.0.0 更新到 1.2.0,并且有多批这样的更新——执行任何更多的迁移可能会破坏您的数据,因为这些迁移必须由它们自己的专用更新命令处理。因此,我只想运行此更新知道如何使用的选定已知迁移,然后对数据执行操作,然后可能运行下一个更新数据命令。(我想尽可能地防守)。

为了实现这一点,我需要上述机制并定义一组固定的迁移来运行这样的命令。

注意:我更喜欢使用一个简单的装饰器,利用魔法__call方法并避免继承(Laravel 在 \Illuminate\Database\Eloquent\Builder包装 中使用的类似机制\Illuminate\Database\Query\Builder),但遗憾的是,它需要在它的构造函数中MigrateCommand的实例。Migrator


最后说明:我想发布这个问题的答案How can I run specific migration in laravel,因为它是 Laravel 5 特定的。但我不能——因为这个问题被标记为这个问题的副本(尽管这个问题被标记为 Laravel 4)。

于 2019-06-16T18:33:32.933 回答
0

您可以键入以下命令:

php工匠迁移--帮助

...

--path[=PATH] 要执行的迁移文件的路径(允许多个值)

...

如果它确实显示了一个名为“--path”的选项(如上面的示例),则意味着您的 Laravel 版本支持此参数。如果是这样,那么您很幸运可以输入以下内容:

php artisan migrate --path=/database/migrations/v1.0.0/

其中“v.1.0.0”是存在于“/database/migrations”目录下的目录,其中包含您要为某个版本运行的那些迁移。

如果没有,那么您可以检查您的迁移表以查看哪些迁移已经运行,如下所示:

SELECT * FROM 迁移;

然后从你的“/database/migrations”文件夹中移出那些被执行的文件夹。通过创建另一个文件夹“/databases/executed-migrations”并将您执行的迁移移动到那里。

在此之后,您应该能够执行:

php工匠迁移

没有任何危险来覆盖架构/数据库中的任何现有表。

于 2019-09-25T00:23:09.197 回答
0

(*) Windows 示例:php artisan migrate --path=database\migrations\2021_05_18_121604_create_service_type_table.php

于 2021-05-20T13:51:23.303 回答
0

我在第 1 行使用了 return,所以以前的 dbs 保持原样。

<?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');
    }
}
于 2019-02-23T09:33:11.017 回答
0

很简单...!只需转到您的迁移文件夹。将所有迁移文件移动到另一个文件夹中。然后将所有迁移一一返回到迁移文件夹中并为其中一个运行迁移(php artisan)。当您将错误的迁移文件插入主迁移文件夹并在命令提示符下运行 php artisan migrate 时会出错。

于 2016-08-03T06:48:55.913 回答