version: rails 4.1
数据迁移(migration)是 Active Record 的一个特性,可以允许你更新你的数据库模式而无关乎时间性。比起用纯SQL语句写模式修改,数据迁移(migration)允许你用简单的 Ruby DSL 来描述你数据表的变更。
阅读完这份教程,你将会了解到:
- 你可以创建生成器(generator)。
- Active Record 提供了一些方法用来操作你的数据库。
- Rake 任务可以操作数据迁移(migration)和你的数据库模式(schema)。
- migration如何来关联到schema.rb。
1 数据迁移概要
Migrations 是一个简单的方式,用一种始终如一和简单的方式来修改你的数据库模式而无关乎时间性。他们使用 Ruby DSL,以致于你不需要手工地写SQL,让你的数据库模式和数据库的修改不耦合。
你可以把每一个 migration 都看做是数据库的一个新的“版本”。一个数据库模式一开始是没有任何东西的,每一个migration修改它,用来增加或删除数据表,数据列或者全部。Active Record 知道如何随着时间线来修改你的模式,在历史版本到最新的版本中找出它当时的版本。Active Record 同样也会更新你的 db/schema.rb 文件,用来匹配你数据库的最新结构。
这里是一个 migration 的例子:
classCreateProducts < ActiveRecord::Migration defchange create_table :productsdo|t| t.string :name t.text :description
t.timestamps end end end |
这个 migration 增加了一个数据表叫做 products,其有一 string 列叫做 name,一 text 列叫做 description。一个主键列叫做 id,它会隐式地增加,它是所有 Active Record models 默认的主键。这个时间戳的宏增加了两列,created_at 和 updated_at。如果他们存在,那么这些列是由 Active Record 自动管理的。
注意到我们所定义的改变,正是我们想要接下来要学习的内容。在这个migration运行之前,是没有数据表的。在运行之后,这个数据表就会存在。Active Record 同样也知道如何去可逆这个 migration:如果我们回滚这个 migration,就会删除这个数据表。
对于支持事务性语句来改变数据模式的数据库,migration 是被整合到一个事务中的。如果数据库不支持这个,当一个 migration 失败时,它的部分执行成功,就是不会整个回滚。你将不得不通过手工的方式回滚剩余的变化。
p.s. 有些查询不会运行在一个事务中。如果你的适配器支持 DDL 事务,对于单个的 migration 你能够使用 disable_ddl_transaction! 来使他们失效。
如果你期待一个 migration 做的某些动作,而使得 Active Record 不知道如何去可逆,你可以使用 reversible:
classChangeProductsPrice < ActiveRecord::Migration defchange reversible do|dir| change_table :productsdo|t| dir.up { t.change :price, :string} dir.down { t.change :price, :integer} end end end end |
或者,你可以使用 up 和 down 来替代这个变化:
classChangeProductsPrice < ActiveRecord::Migration defup change_table :productsdo|t| t.change :price, :string end end
defdown change_table :productsdo|t| t.change :price, :integer end end end
|