迁移使用一种统一,简单的方式,按照时间顺序修改数据库的模式。
迁移使用Ruby DSL编写,不需手动编写SQL语句,对数据库的操作和所用的数据库种类无关。
可以将每个迁移看做是数据库的一个修订版本。数据库初始时为空,各个迁移会添加或是删除数据表,字段或是记录。
Active知道如何按照时间线更新数据库,不管数据库现在的模式如何都能更新到最新结构。同时Active Record还会更新db/schema.rb文件,匹配最新的数据库结构。
迁移示例:
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.text :description t.timestamps end end end
这个迁移创建了一个名为products的表,然后在表中创建字符串字段name和文本字段description。名为id的主键字段会被自动创建。
id字段是所有Active Record模型的默认主键,timestamps方法会创建两个字段,created_at和updated_at。
如果想在迁移中执行Active Record不知如何撤销的操作,可以用reversible方法。
class ChangeProductsPrice < ActiveReocrd::Migration def change reversible do |dir| change_table :products do |t| dir.up { t.change :price, :string } dir.down { t.change :price, :string } end end end end或者不使用change方法,分别使用up和down方法
class ChangeProductsPrice < ActiveRecord::Migration def up change_table :products do |t| t.change :price, :string end end def down change_table :products do |t| t.change :price, :integer end end end
迁移文件存储在db/migrate文件夹中,迁移的类名(驼峰式)要和文件名时间戳后面的部分匹配,Active Record提供了生成器,
根据生成器中关键字的不同可以实现不同迁移文件。【见迁移文件生成器命令】
模型生成器和脚手架生成器会生成合适的迁移,创建模型。
rails generate model Product name:string description:text会生成如下的迁移文件
class CreateProducts < ActiveRecord::Migration def change create_table :products do |t| t.string :name t.text :description t.timestamps end end end
支持类型修饰符
在字段类型后面,可以在花括号中添加选项。【见类型修饰符】
create_table方法最常用,大多数都会由模型和脚手架生成器生成。
create_join_table方法用来创建HABTM联合数据表。
使用change_table用来修改现有的数据表,用法和create_table类似,不过传入块的参数知道更多的技巧。
如果Active Record的帮助方法不够用,可以使用excute方法,执行任意的SQL语句:
change是迁移中最常用的方法,完成指定的操作。而且Active Record知道如何撤销这些操作。而且change中只能使用指定的方法。
如果要使用任何其他方法,可以使用revesible方法,或者不定义change方法,而是分别定义up和down方法。
Active Record可能不知如何撤销复杂的迁移操作,可以使用reversible方法指定运行迁移和撤销迁移时怎么操作。
在迁移方法中,不使用change方法,而使用up和down方法。
up方法定义要对数据库模式做哪些操作,down方法来撤销这些操作。撤销时最好按照添加的相反顺序执行。
Active Record提供了撤销迁移的功能,通过revert方法实现。
Rails提供很多Rake任务,用来执行指定的迁移。
最常用的是 rake db:migrate,执行还没执行的迁移中的change和up方法。如果没有未运行的迁移,直接退出。
rake db:migrate按照迁移文件名中时间戳顺序执行迁移。
注意:执行db:migrate时还会执行db:schema:dump,更新db/schema.rb文件,匹配数据库结构。
回滚到之前的操作: rake db:rollback
这个操作会回滚到上一次迁移,撤销change方法中的操作,或是执行down方法。
如果想执行多个迁移,可以使用STEP参数:
rake db:rollback STEP=3
rake db:setup任务会创建数据库,加载模式,并填充种子文件。
rake db:reset任务会删除数据库,然后重建,等价于rake db:drop db:setup
想执行指定迁移,或是撤销指定的迁移,可以使用db:migrate:up和db:migrate:down任务,指定相应的版本号,
rake db:migrate:up VERSION=20140523123456
默认情况下,rake db:migrate任务在development环境下执行,可以指定执行环境, RAILS_ENV参数
迁移的作用并不是为数据库提供可信的参考源。
db/schema.rb或是由Active Record生成的SQL文件才有这个作用。db/schema.rb这些文件不可修改,其目的是表示数据库的当前结构。
导出模式有两种方法,由config/application.rb文件中的config.avtive_record.schema_format选项设置,可以是:sql或:ruby
Active Record在模型中而不是数据库中设置关联。
Rails提供种子功能,可以把初始化的数据存入数据库。在db/seeds.rb文件中,然后执行rake db:seed即可。