Answers:
rake db:migrate:redo VERSION=xxxxxxx
,但这将运行down
然后执行该up
步骤。您可以结合注释掉向下的步骤来执行此操作。
rake -T
。
db:test:prepare
也不会出现在该列表中。天哪,我迟到了。
rake db:migrate:up VERSION=my_version
可能什么也不做,因为schema_migrations表仍然说它已经运行了。在相同的情况下rake db:migrate:redo VERSION=my_version
可能会失败,因为它无法删除表。在这种情况下,请down
暂时注释掉迁移中的方法,然后重新运行rake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
类似地rake db:migrate:down
减少特定的迁移。您可以使用来获得可用的瑞克任务列表rake -T
。
VERSION
提到的是每个迁移文件开头的整数值(这只是创建时间的时间戳)。例如, VERSION=20150720023630
。
VERSION
它只是一个环境变量,因此它可以在命令中排在首位,甚至可以在命令前设置:VERSION=1234567890 rake db:migrate:up
我必须运行一个已更改的迁移,并且需要独立于所有其他迁移来重新运行。启动控制台并执行以下操作:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
更有用的是,可以将其放入rake任务等中。
change
,请YourMigrations.migrate(:up)
改为(或:down
也可以运行)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
试试看。
VERSION
只是一个环境变量,因此它可以在命令中排在首位,甚至可以在命令前设置:VERSION=20098252345 rake db:migrate
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时,它将再次运行它。
但是,这几乎总是一个坏主意。可能有意义的一个例子是,如果您有一个开发分支,但还没有充实您的迁移,并想在开发中添加一些东西。但是即使那样,最好还是进行两次迁移,以便您可以正确地回滚并重复尝试。
必须有一种通过控制台运行迁移类的方法。我似乎无法识别迁移代码。
但是,正如注释所示,最好按顺序运行迁移。用:
rake db:migrate VERSION=##########
将代码复制并粘贴到迁移到脚本/控制台的迁移中?
我有一个实用程序方法,使开发过程非常容易。我发现它可以帮助我避免创建过多的迁移-通常,我会修改迁移,直到部署完成为止。
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
当我大量更改迁移时,我不想在迁移中丢失大量数据(尤其是当我导入需要很长时间才能导入的旧数据时)时,就在开发中使用了此技术。我不想再次重新导入)。
这是100%的骇客行为,我绝对不建议在生产中这样做,但可以做到这一点:
STEP=n
向db:migrate
(添加n
要运行的迁移的数量在哪里,就像在for上一样db:rollback
)添加一个参数-然后就可以执行rake db:migrate STEP=1
orrake db:migrate STEP=2
等等