`
mypages
  • 浏览: 90350 次
  • 性别: 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'

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

分享到:
评论

相关推荐

    rails2.0下实现《rubyonrails》中的mybook实例

    标题提到的“mybook”很可能是一个示例应用,用于展示如何在Rails中创建和管理书籍相关的数据。 首先,`sqlite3.def`和`sqlite3.dll`是SQLite数据库在Windows系统中的关键组件。`sqlite3.def`文件是动态链接库(DLL...

    centOS Rails3环境搭建

    ### CentOS环境下Rails 3开发环境搭建详解 #### 一、准备工作与环境配置 在开始部署Rails 3开发环境之前,我们需要确保系统上已经安装了一些基本的软件包和工具。这一步骤对于后续的Ruby和Rails安装至关重要。 ##...

    中文版rails教程

    使用`rails generate`命令可以快速创建模型、控制器、视图等文件,如`rails generate scaffold Post title:string content:text`会生成一个名为Post的资源,包含相关的数据库迁移文件、模型、控制器和视图。...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    17.4 数据迁移任务 225 17.5 高级迁移任务 227 17.6 迁移任务的缺点 230 17.7 在迁移任务之外操作数据库结构 231 17.8 管理迁移任务 231 第18章 ActiveRecord第一部分:基础 233 18.1 表和类 233 18.2 字段和属性 ...

    simply rails

    - **第一个Rails应用**:通过创建一个简单的博客应用,引导读者理解Rails的基本工作流程,如生成器(Generators)、路由(Routing)和数据库迁移(Migrations)。 #### 3. **深入Ruby** - **Ruby语言基础**:解释...

    ruby on rails 2.1 what is new (CN)

    经过多年的迭代和发展,Ruby on Rails 2.0于2007年12月发布,带来了许多重要的更新。而在接下来的几个月里,全球超过1400名开发者为Rails贡献了1600多个补丁,最终在2008年6月1日,Ruby on Rails 2.1正式发布。这次...

    RoR 培训课程PPT

    - **创建第一个应用**:演示如何利用Rails提供的命令行工具快速构建应用的基本结构。 - **第二天**:文件管理、生成器和脚本、迁移。 - **文件管理**:讲解Rails项目的文件组织方式,包括各种文件的作用及其存放...

    Ruby-Doorkeeper是Rails的一个OAuth2提供者OAuth20协议的一个Ruby封装

    Ruby-Doorkeeper是一个针对Rails应用的OAuth 2.0提供商,它实现了OAuth 2.0标准,为开发者提供了强大的身份验证和授权功能。OAuth 2.0是一种广泛使用的开放标准,用于允许第三方应用安全地访问用户的数据,而无需...

    Wrox.The.Art.of.Rails.May.2008

    - **迁移工具**:介绍Rails提供的数据库迁移工具及其使用方法。 13. **第十二章:行为驱动开发与RSpec** - **测试驱动开发**:讲解如何采用RSpec进行行为驱动开发。 - **单元测试实践**:提供具体的单元测试示例...

    rails_template:我制作了一个 Rails 模板

    在Ruby世界中,Rails是一个非常流行的开源Web应用框架,它基于MVC(Model-View-Controller)架构模式,用于快速开发高效、优雅的Web应用程序。`rails_template`提及的项目可能是一个自定义的Rails初始化模板,它允许...

    使用v2授权程序的Todo应用程序的Ruby后端.zip

    通过上述分析,我们可以看出这个项目是一个使用Ruby on Rails开发的Todo应用,涉及到了MVC架构、OAuth 2.0或JWT授权、数据库操作和测试等多个关键点。开发者需要对Ruby、Rails框架、数据库管理和授权机制有深入理解...

    redmine-0.8.2

    - **数据迁移**: 在升级前,一定要备份所有数据,以防在迁移过程中出现任何问题。 - **测试环境**: 在生产环境之外的地方(如本地机器或测试服务器)进行升级操作,以确保一切顺利。 总之,虽然"redmine-0.8.2"在...

    dragonfly-activerecord:蜻蜓的 ActiveRecord 支持的数据存储

    蜻蜓活动记录 为提供数据存储,由 ActiveRecord 支持。 需要使用 Dragonfly 1.0+ 的 Rails 应用程序。 经 MRI 1.9.3、2.0、2.1 测试; ActiveRecord 3.2 和 4.0;...创建迁移: $ rails generate migration add_

    meditation-app-master.zip

    4. **database**:如果应用有数据库需求,这里可能包含数据库模型、配置文件和可能的数据迁移脚本。 5. **images** 或 **assets**:存储应用使用的图像、音频文件和其他媒体资源的地方。 6. **config**:可能包含...

    Jobs_board:使用类别的简单工作板应用程序

    3. **ActiveRecord**: 了解如何使用ActiveRecord进行数据库操作,如定义模型、创建和迁移数据库表、执行查询等。 4. **Bootstrap 3**: 熟悉Bootstrap的组件,如网格系统、表单、按钮和导航,以及如何在Rails应用中...

    ToDo-App:待办事项应用程序 2015

    这个项目创建于2015年,它基于Ruby 2.0版本,这是一个稳定且功能丰富的解释型语言,为开发Web应用程序提供了良好的支持。Ruby 2.0引入了诸多性能优化和新特性,如并发性的改进和垃圾回收机制的增强,使得代码运行...

    Grails基础教程

    Web 2.0时代的到来标志着互联网应用进入了一个全新的阶段,这一时期的应用更加注重用户体验、实时交互及个性化服务。Web 2.0的核心理念包括用户生成内容、社会网络、开放API等,这要求开发工具能够更好地支持敏捷...

    Pizza:比萨应用程序 - 演示

    【比萨应用程序 - 演示】是一款基于Ruby 2.0版本开发的Web应用程序,其主要功能是提供比萨搜索服务。这款应用利用Rails 4.1框架,这是一个非常流行的Ruby Web开发框架,它提供了丰富的功能和简洁的语法,使得开发者...

Global site tag (gtag.js) - Google Analytics