`
mypages
  • 浏览: 88017 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

rails2.0应用创建(3)数据迁移

阅读更多

1、抽象层上看看 migration 迁移:

       需要更改数据库结构,我们便创建一个数据库 migration 迁移, 将这个 migration 迁移放在一个单独的文件内 ,在迁移内(用一定的格式)描述数据库更改的内容 ,并 将迁移与另外的应用程序文件一起放在版本控制下。然后对数据库使用这个 migration 迁移(执行迁移),结果数据库结构被更改

       每个 migration 迁移都会有一个序号与其关联,这些序号从 1 开始, 新的 migration 迁移都会得到下一个有效序号, Rails 会记住应用给数据库 migration 迁移的最后一个序号。当运行迁移时,Rails 将数据库 schema 的序号与有效的 migragion 迁移序号进行比较,如果它发现 migration 迁移的序号大于数据库的 schema ,它就会应用(执行) migration 迁移。

            我们通过让每个 migration 迁移都是可回溯的来 回溯 schema 的版本 。每个 migration 迁移实例上都包含两个指令集。一套告诉 Rails 在应用 migration 迁移时对数据库做出什么修改,另一套则告诉 Rails 如何回溯这些修改。 要回溯一个 schema ,我们只要简单地告诉 Rails 我们需要数据库 schema 序号就可以了。如果当前数据库 schema 有个比目标序号更高的序号,则 Rails 会接受带有数据库当前序号的 migration 迁移,并使用它进行回溯。这会从 schema 中移除 migration 迁移的修改,并降低数据库的序号。它会反复执行此过程直到得到期望的数据库版本。

     具体如下:当运行 rake db:migrate命令时rake首先检查schema_info 表(该表一行一列,由migration迁移代码管理,用于记住当前的数据库版本。 )。如果该表不存在,它将创建一个并且生成版本号为当前时间 的记录。若该表存在,则从表中读取版本号。

然后 migration 迁移代码查看 db/migrate 目录下的所有 migration 迁移文件。如果有序号 晚于 当前数据库的版本号,那么会为数据库依次应用每个 migration 迁移文件。在最晚一个 migration 迁移文件应用后, schema_info 表的版本号会被更新为该文件的序号。

如果我们这一序号上再次运行 migration 迁移,则不会发生任何事。 但是,如果我们随后创建了一个新的 migration 迁移文件,它就会有个晚于数据库版本号的序号。如果我们随后运行该 migration ,则这个新的 migration 迁移文件会被运行。

可以通过给 rake db:migrate 命令行应用 VERSION= 参数来为数据库强制指定一个特定的版本号。如果你给出的版本号晚于数据库的版本号,则会以运行数据库版本的 migration 开始,以你指定的版本 migration 结束。 如果命令行的版本号早于当前数据库的版本号, 任务 查找与数据库版本匹配的 migration 迁移文件,并且回溯它,之后降低数据库版本号,查找匹配文件,再回溯它,直到版本号匹配命令行中指定版本号。也就是说, migration 迁移被向后应用以回溯 schema 回到你指定版本。

   2、相关情况

 

      (1)迁移文件的创建:可手工创建但一般要用生成器来创建,生成器在生成模型的同时将会生成迁移文件(ruby script/generate model discount),也可用生成器直接生成迁移文件(script/generate migration add_price_column)。

 

    (2)迁移文件

class AddEmailColumnToOrders < ActiveRecord::Migration

    def self.up

        add_column :orders, :e_mail, :string

    end

 

    def self.down

        remove_column :orders, :e_mail

    end

end

 

(2)migration 迁移支持的(column type )列类型包括:

:binary :boolean :date :datetime :float :integer :string :text :time ,和 :timestamp

为支持不同数据库之间的迁移,Rails migration 将从具体的数据库类型系统隔离开而使用逻辑类型。如果你迁移一个 MySQL 数据库,那么 :string 类型将创建一个 varchar(255) 类型的列。在 Postgres 上,同样的迁移会添加一个 varing(255) 类型的列。

 

 

(3)在定义数据库列类型时可指定三个选项,每个选项由 key=>value 对给出:

1 :null => true or false

如果为 true ,则基础列被添加一个不能为 null 的约束 ( 如果数据库支持的话 )

2 :limit => size

设置字段尺寸的限制。这基本上出现在用 string 创建数据库的列时。

3 :default => value

 

为列设置缺省值时,如果传递一个 Ruby ( Ruby 表达式 ) ,这个值便会成为的默认值。对一些数据库,你也可以传递一个包含数据库指定表达式的字符串。例如,指定 add_column :orders, :placed_at, :datetime, :default => Time.now 将在 migration 迁移运行时,设置列的默认值为日期和时间,指定 add_column :orders, :placed_at, :datetime, :default => "now()" 会设置 MySQL now() 函数为默认值,因此当前日期时间将被插入到任何新的行内。后面的语法很明显是数据库指定的。

       迁移类型选项的例子:  

add_column :orders, :name, :string, :limit => 100, :null => false

add_column :orders, :age, :integer

add_column :orders, :ship_class, :string, :limit => 15, :default => 'priority'

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics