耙一次迁移

时间:2009-08-25 22:25:01

标签: ruby-on-rails database migration rake

我正试图在我的rails应用程序中运行一大堆迁移。我怎样才能做到这一点?我不希望在它之前或之后运行任何迁移。感谢。

11 个答案:

答案 0 :(得分:156)

rake db:migrate:redo VERSION=xxxxxxx,但这会运行down,然后是up步骤。您可以暂时注释掉向下步骤。

答案 1 :(得分:69)

rake db:migrate:up VERSION=1234567890

类似rake db:migrate:down来执行特定的迁移。您可以使用rake -T获取可用的佣金任务列表。

答案 2 :(得分:24)

我必须运行一个已更改的迁移,并且需要独立于所有其他迁移重新运行。启动控制台并执行此操作:

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

更有用的是,这可以用于rake任务等。

答案 3 :(得分:10)

rake db:migrate:up VERSION=version_no

将迁移(添加)特定迁移脚本

rake db:migrate:down VERSION=version_no

将删除特定的迁移脚本

答案 4 :(得分:9)

rake db:migrate VERSION=20098252345

尝试一下。

答案 5 :(得分:3)

通过上面的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。

答案 6 :(得分:3)

rake db:migrate:redo version='xxxx'   

请记住在xxxx周围加上引号,xxxx是迁移的时间戳(或迁移ID)。

您可以使用

检查之前迁移的时间戳(迁移ID)
rake db:migrate:status    

答案 7 :(得分:2)

为此添加我的2¢,因为我遇到了同样的问题:

如果您绝对想要在不创建新迁移的情况下再次运行迁移,则可以执行以下操作:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

rails会“忘记”它运行20150105181157的迁移。现在当你运行db:migrate时,它将再次运行它。

但这几乎总是一个坏主意。它可能有意义的一个例子是,如果你有一个开发分支,你还没有充实你的迁移,并希望在开发中添加一些东西。但即便如此,最好还是双向迁移,这样才能正确地回滚和重试。

答案 8 :(得分:1)

必须有一种方法可以通过控制台运行迁移类。我似乎无法使迁移代码可识别。

但是,正如评论所示,最好按顺序运行迁移。使用:

rake db:migrate VERSION=##########

将代码复制并粘贴到迁移到脚本/控制台?

答案 9 :(得分:1)

我有一个实用程序方法,使开发非常容易。我发现它可以帮助我避免创建过多的迁移 - 通常我会在迁移之前修改迁移。

http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/

答案 10 :(得分:0)

我在开发过程中使用这种技术时,我将迁移量大幅下降,而且我不希望在此过程中向下迁移并丢失任何数据(特别是当我导入旧版本时)需要很长时间的数据,我不想再次重新导入)。

这是100%的hackish,我绝对不会建议在制作中这样做,但它会做到这一点:

  1. 将要从其目录重新运行的迁移移至临时位置
  2. 生成另一个名称相同的迁移
  3. 将原始迁移代码复制/粘贴到新生成的迁移文件中
  4. 运行新迁移
  5. 删除新生成的迁移文件
  6. 编辑架构迁移以删除最新值
  7. 恢复旧的迁移文件