是否有一种简单的方法来运行单个迁移?我不想迁移到某个版本,我只想运行一个特定的版本。


当前回答

如果你想从控制台运行它,这是你要找的:

$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)

我尝试了其他答案,但要求没有Rails。根对我没用。

此外,.migrate(:up)部分强制迁移重新运行,无论它是否已经运行。这对于当你已经运行了一个迁移,但因为打乱了db而有点取消了它,并且想要一个快速的解决方案重新启动它的时候很有用。

其他回答

如果你在路径上有问题,你可以使用

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

如果你想从控制台运行它,这是你要找的:

$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)

我尝试了其他答案,但要求没有Rails。根对我没用。

此外,.migrate(:up)部分强制迁移重新运行,无论它是否已经运行。这对于当你已经运行了一个迁移,但因为打乱了db而有点取消了它,并且想要一个快速的解决方案重新启动它的时候很有用。

请注意,您可能不得不在新的rails环境中使用rails runner而不是script/runner。

看起来至少在最新的Rails发行版(撰写本文时为5.2)中还有一种过滤正在运行的迁移的方法。可以在SCOPE环境变量中传递一个过滤器,然后使用该过滤器选择迁移文件。

假设您有两个迁移文件1_add_foos。Rb和2_add_fos .run_this_one. Rb运行

SCOPE=run_this_one rails db:migrate:up

将只选择并运行2_add_fos .run_this_one.rb。请记住,将运行与范围匹配的所有迁移文件。

你可以直接从ruby文件中运行代码:

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.new.up

注意:非常老版本的rails可能需要addfoo。up而不是addfoo .new.up。

另一种方法(没有IRB)依赖于require返回类名数组的事实:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

注意,如果这样做,就不会更新schema_migrations表,但这似乎正是您想要的结果。

此外,如果无法找到文件,您可能需要使用require("./db/…"或根据您的工作目录尝试require_relative