我试图在我的 Rails 应用程序中只运行一个迁移。我怎样才能做到这一点?我不想在它之前或之后运行任何迁移。谢谢。
11 回答
rake db:migrate:redo VERSION=xxxxxxx
,但这将运行down
然后up
步骤。您可以结合临时注释掉向下步骤来执行此操作。
rake db:migrate:up VERSION=1234567890
类似rake db:migrate:down
地取消特定的迁移。您可以使用 获取可用的 rake 任务列表rake -T
。
我不得不运行一个更改并且需要独立于所有其他迁移重新运行的迁移。启动控制台并执行以下操作:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
更有用的是,这可以放入 rake 任务等中。
rake db:migrate:up VERSION=version_no
将迁移(添加)特定的迁移脚本
rake db:migrate:down VERSION=version_no
将删除特定的迁移脚本
rake db:migrate VERSION=20098252345
试试看。
rake db:migrate:redo version='xxxx'
请记住在 xxxx 周围加上引号,xxxx 是您迁移的时间戳(或迁移 ID)。
您可以通过使用检查您之前完成的迁移的时间戳(迁移 ID)
rake db:migrate:status
扩展上面 korch 的答案,require
对我不起作用,但load
确实如此。具体来说,对于迁移文件:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
在控制台输入
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
为我工作。
> Race.new.min_quantity # => 0
这适用于 ruby 1.9.3p484(2013-11-22 修订版 43786)[x86_64-linux] 和 Rails 3.2.13。
添加我的 2 美分,因为我遇到了同样的问题:
如果您绝对想再次运行迁移而不创建新迁移,您可以执行以下操作:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
Rails 会“忘记”它为 20150105181157 运行迁移。现在,当您运行 db:migrate 时,它将再次运行它。
不过,这几乎总是一个坏主意。它可能有意义的一个实例是,如果您有一个开发分支并且您还没有充实您的迁移并希望在开发中添加一些东西。但即便如此,最好还是让您的迁移 2 路,这样您就可以正确回滚并反复重试。
必须有一种通过控制台运行迁移类的方法。我似乎无法识别迁移代码。
但是,正如评论所示,最好按顺序运行迁移。采用:
rake db:migrate VERSION=##########
在迁移到脚本/控制台时复制并粘贴您的代码?
我有一个实用方法可以让开发变得非常容易。我发现它可以帮助我避免创建过多的迁移——通常我会修改迁移,直到它们被部署。
http://fullware.net/index.php/2011/05/26/easy-load-rails-migrations-for-console-execution/
当我对迁移进行大量更改时,我会在开发中使用这种技术,并且我不想迁移大量数据并在此过程中丢失任何数据(尤其是当我导入需要很长时间的遗留数据时我不想再次重新导入)。
这是 100% hackish,我绝对不建议在生产中这样做,但它会解决问题:
- 将要重新运行的迁移移出其目录到临时位置
- 生成另一个同名迁移
- 将原始迁移代码复制/粘贴到新生成的迁移文件中
- 运行新的迁移
- 删除新生成的迁移文件
- 编辑您的架构迁移以删除最新的值
- 恢复旧的迁移文件