`
jiajie0531
  • 浏览: 27551 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Rails Database Migrations 4 Running Migrations 运行数据迁移

阅读更多

version: rails 4.1

4 运行 migrations

 

Rails 提供了一个 Rake 任务的集合,用来运行 migrations 的某个集合。

 

你将会使用的关于 Rake 任务的第一个数据前置的指令可能是 rake db:migrate。在它的最基本的form中,为了所有的还没有运行的 migrations, 它仅仅运行 change 或者 up 方法。如果还没有这样的 migrations,它就存在了。它将会按顺序,基于migration的日期来运行这些数据迁移。

 

注意,运行 db:migrate 任务也会调用 db:schema:dump 任务,将会更新你的 db/schema.rb 文件来匹配你的数据库的结构。

 

如果你详细指定一个目标版本,Active Record 将会运行必须的 migrations(change, up, down)直到它已经到达特定的版本。这个版本是基于数字形式前缀的 migration 文件名。例如,为了 migrate 版本 20080906120000 运行:

$ bin/rake db:migrate VERSION=20080906120000

如果版本 20080906120000 大于现在的版本(i.e. 它是向上migrate),将会运行 change (或者 up)方法上升到版本 20080906120000,将不会产生后续的 migrations。如果向下 migrate,将会运行 down 方法向下migrations,但没有版本 20080906120000。

4.1 Rolling Back 回滚

一个平常的任务是回滚到上一个 migration。例如,如果你在其中犯了个错误,然后期待更正它。相比较向下降版本,涉及到以前的  migration,你可以运行:

$ bin/rake db:rollback

这将会回滚到最近的版本, 或者恢复 change 方法,或者运行 down 方法。如果你需要撤销一些 migrations,你能够提供一个 STEP 参数:

$ bin/rake db:rollback STEP=3

将会恢复到最近第三个 migrations。

db:migrate:redo 命令用来做一个回滚是一个捷径,然后再一次备份 migration。正是 db:rollback 这个命令,你能够使用 STEP 参数,如果你需要去更多的一个版本来回退,例如:

$ bin/rake db:migrate:redo STEP=3

这几个 Rake 指令所执行的操作,你不能够和 db:migrate 一起使用。他们是比较简单的,既然你不需要显示地指定所需要数据迁移的版本。

 

4.2 Setup the Database 建立数据库

rake db:setup 指令将会创建数据库,载入数据库模式和生成数据来初始化。

 

4.3 Resetting the Database 重置数据库

rake db:reset 指令将会删除数据库,然后再建立。这个就是 rake db:drop db:setup 的翻版。

p.s.:对于运行所有的 migrations 是不一样的。将仅仅使用当前 schema.rb 文件的内容。如果一个migration 不能够被回滚,rake db:reset 可能不会帮到你。为了找更多的关于数据库模式的内容,可以参考 Schema Dumping and You

4.4 Running Specific Migrations 运行指定的migrations

如果你需要运行一个指定的migration,升版本或者降版本,db:migrate:up 和 db:migrate:down 指令能完成上述任务。只要指定合适的版本,相对应的 migration 将会自己更改,调用 up 或者 down 方法,例如:

$ bin/rake db:migrate:up VERSION=20080906120000

将会运行 20080906120000 版本的 migration 通过运行 change 方法(或者 up 方法)。这个任务将会首先检查 migration 是否已经被执行,如果 Active Record 相信 它已经在运行了,那么就啥也不需要做。

4.5 Running Migrations in Different Environments 在不同的环境运行migrations

默认的情况下,运行 rake:migrate 将是在 开发环境中执行的。为了在另外的环境中再一次运行 migrations,当运行这条命令的时候,你可以使用 RAILS_ENV 环境变量来指定它。例如,为了能在测试环境中运行 migrations,你可以这样做:

$ bin/rake db:migrate RAILS_ENV=test 

 

4.6 Changing the Output of Running Migrations 改变运行migrations的输出

默认情况下,migrations 会确切告诉你他们在执行什么以及需要执行多长时间。一个 migration 创建了一个数据表和增加了一个索引,可能会产生如下的索引:

==  CreateProducts: migrating =================================================

-- create_table(:products)

   -> 0.0028s

==  CreateProducts: migrated (0.0028s) ========================================

在 migrations中有一些提供的方法,允许你去控制所有的这些:

suppress_messages() 用一个代码块来作为一个参数,停止由代码块产生的任何输出。

say() 用一个信息参数,然后打印出信息。第二个boolean 参数能够被代入到详细指定是否缩排。

say_with_time() 输出文本,具体时间由它所运行的代码块决定。如果代码块返回一个 integer, 它假设

的是所影响的行数。

例如,这个 migration:

classCreateProducts < ActiveRecord::Migration

  defchange

    suppress_messages do

      create_table :productsdo|t|

        t.string :name

        t.text :description

        t.timestamps

      end

    end

 

    say "Created a table"

 

    suppress_messages {add_index :products, :name}

    say "and an index!", true

 

    say_with_time 'Waiting for a while'do

      sleep 10

      250

    end

  end

end

生成如下的输出:

==  CreateProducts: migrating =================================================

-- Created a table

   -> and an index!

-- Waiting for a while

   -> 10.0013s

   -> 250 rows

==  CreateProducts: migrated (10.0054s) =======================================

如果你想让 Active Record 不再输出任何东西,可以运行 rake db:migrate VERBOSE=false 将会制止所有的输出。

 

 

original url: http://guides.rubyonrails.org/migrations.html#running-migrations

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics