Rails Database Migrations

迁移简介

迁移使用一种统一,简单的方式,按照时间顺序修改数据库的模式。

迁移使用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方法

change是迁移中最常用的方法,完成指定的操作。而且Active Record知道如何撤销这些操作。而且change中只能使用指定的方法。

如果要使用任何其他方法,可以使用revesible方法,或者不定义change方法,而是分别定义up和down方法。

使用reversible方法

Active Record可能不知如何撤销复杂的迁移操作,可以使用reversible方法指定运行迁移和撤销迁移时怎么操作。

使用up和down方法

在迁移方法中,不使用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和引用完整性

Active Record在模型中而不是数据库中设置关联。

迁移和种子数据

Rails提供种子功能,可以把初始化的数据存入数据库。在db/seeds.rb文件中,然后执行rake db:seed即可。

你可能感兴趣的:(Rails,ActiveRecord,migration)