华仔学Rails Guide-Active Record迁移

收藏文章 点赞鼓励

Active Record迁移

迁移是以一致和轻松的方式按时间顺序修改数据库模式的实现方法,它使用Ruby DSL,因此不必手写SQL,从而实现了数据库无关的数据库模式的创建和修改。

我们可以把迁移看做数据库的新“版本”。数据库模式一开始并不包含任何内容,之后通过一个个迁移来添加或删除数据表、字段、记录。Active Record知道如何沿着时间线更新数据库模式,使其从任何历史版本更新为最新版本。Active Record还会更新db/schema.rb文件,以匹配最新的数据库结构。

下面是一个迁移的示例:

1
2
3
4
5
6
7
8
9
10
class CreateProducts < ActiveRecord::Migration[5.0]
   def change 
         create_table :products do |t|
                t.string :name
                    t.text :description

                    t.timestamps
             end 
     end 
end

这个迁移用于添加product数据表,数据表中包含name字符串字段和description文本字段。同时隐式添加了id主键字段,这是所有Active Record模型的默认主键。timestemps宏添加了created_at和updated_at两个字段。后面这几个特殊字段只要存在就由Active Record自动管理。

注意这里定义的对数据库的修改是按时间进行的。在这个迁移运行之前,数据表还不存在。在这个迁移运行之后,数据表就被创建了。Active Record还知道如何撤销这个迁移:如果我们回滚这个迁移,数据表就会被删除。

为了支撑事务并提供了用于修改数据库模式的语句的数据库,迁移被包装在事务中,如果数据库不支持事务,那么党迁移失败时,已成功的那部分操作将无法回滚。这种情况下只能手动完成相应的回滚操作。

某些查询不能在事务内部运行。如果数据适配器支撑DDL事务,就可以使用disable_ddl_transaction!方法在某个迁移中临时禁止事务。

创建迁移

2.1创建独立的迁移

迁移文件存储在db/migration文件夹中,一个迁移文件包含一个迁移类。文件名字采用YYYYMMDDHHMMSS_create_products.rb形式,即:UTC时间戳+下划线+迁移名称。迁移类的名称类的名称(驼峰式)应该匹配文件名中迁移的名称。例如,在20080906120000_create_products.rb 文件中应该定义 CreateProducts 类,在 20080906120001_add_details_to_products.rb 文件中应该定义 AddDetailsToProducts 类。Rails根据文件名的时间戳部分确定要运行的迁移和迁移运行的顺序,因此当需要把迁移文件复制到其他Rails应用,或者自己生成迁移文件时,一定要注意迁移运行的顺序。

当然,计算时间戳不是什么有趣的事,因此Active Record提供了生成器,如

命令rails g model product会生成不带字段的迁移文件

1
2
3
4
5
6
7
8
class CreateProducts < ActiveRecord::Migration[5.0]
   def change 
         create_table :products do |t|

                    t.timestamps
             end 
     end 
end

命令rails g model product name:string description:text user_id:integer:index会生成带字段内容的迁移文件

1
2
3
4
5
6
7
8
9
10
11
12
class CreateProducts < ActiveRecord::Migration[5.0]
   def change 
         create_table :products do |t|
                t.string :name
                    t.text :description
                    t.integer :user_id 

                    t.timestamps
             end 
             add_index :products, :user_id
     end 
end

命令rails g migration add_price_to_products会生成不带字段内容的迁移文件,需要自己添加字段

1
2
3
4
5
class AddPriceToProducts < ActiveRecord::Migration[5.0]
  def change

  end
end

命令rails g migration add_price_to_products price:会生成带字段内容的迁移文件

评论区