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