`
ddtlby
  • 浏览: 23523 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
最近访客 更多访客>>
社区版块
存档分类
最新评论

Rails migration简介

阅读更多
 

migration好像是rails 1.0出的功能,到底它是什么什么东东?用来干吗的?且听下面分解. <o:p></o:p>

migration是一种分布环境下的数据库同步功能,它提供了: 1.独立于特定SQLschema描述(当然是用ruby DSL).目前除了DB2外别的主流商用和开源数据库都被支持.(IBM真衰).显然,这种数据库独立的schema描述不可能包括数据库特定的细节, 所以在生产环境中需要再行调试优化. 2.schema和数据内容版本控制.我不是DBA(虽然曾经想过干这个),不知道有什么别的工具可以做数据库版本控制. 3.基于版本控制的分布式数据库同步. <o:p></o:p>

先来说说基于ruby DSLschema描述巴,打打基础. 如果rails项目中的数据库已经设计配置好了,可以执行rake db:schema:dump(这是Rails1.1rake新语法,以前是rake db_schema_dump) 然后会生成db/schema.rb文件.打开一看,基本结构类似这样的: <o:p></o:p>

<o:p> </o:p>

ActiveRecord::Schema.define(:version => 5) do<o:p></o:p>

  create_table "choices",:id => false, :force => true do |t|<o:p></o:p>

    t.column "name", :string,, :limit => 30, :default => 'idiolt'<o:p></o:p>

    t.column "content", :text, :limit => 100<o:p></o:p>

    t.column "question_id", :integer, :null => false<o:p></o:p>

  end<o:p></o:p>

...<o:p></o:p>

:version以后用了migrate才会看见,现在应该是空的,先不管这个. 如你所见这个表定义非常直观.需要说明的几个选项. <o:p></o:p>

:force代表强制覆盖,默认false后面执行db:schema:load把表结构导回数据库的时候如果表已经存在由这个选项决定是否覆盖. :id参数默认为true,也就是按照rails约定每个表自动建立id字段作为主键.false的话意思是你自己在schema中建立主键. :limit:default不用解释了吧. :null也没啥好解释的,false代表着SQL里的NOT NULL <o:p></o:p>

你们已经看到db:schema:load,恭喜,现在哪怕你不关心版本控制和分布式同步这些 "遥远的事". 你也可以从容在各种不同数据库直接移植表结构了.这可是DBA都头疼的事呢. 只要改一下database.yml的配置再执行rake db:schema:load就可以了. <o:p></o:p>

现在来说说版本控制和同步.数据库毕竟不是代码,除了schema外还有数据的.像上面这样 load导进去的话会覆盖掉所有的数据. 所以我们需要找一个对数据影响最小的方法来更新数据库. 这部分需要做些手工操作了: script/generate migration XXX 建立一个migration版本,这个操作会在db/migration下产生nnn_XXX.rb文件. 同时 generate model的时候也会顺带产生nnn_create_XXX.rb文件. 内容类似: <o:p></o:p>

<o:p> </o:p>

class CreatePortfolios < ActiveRecord::Migration<o:p></o:p>

  def self.up<o:p></o:p>

    create_table :portfolios do |t|<o:p></o:p>

      t.column :name, :string<o:p></o:p>

    end<o:p></o:p>

  end<o:p></o:p>

  def self.down<o:p></o:p>

    drop_table :portfolios<o:p></o:p>

  end<o:p></o:p>

end<o:p></o:p>

up方法定义这个版本该做什么,down定义怎么回滚版本. 这里up里面创建了一个表, 方法和上面schema.rb里的一样. 除此外更常用的是对字段和索引的修改方法, add_column/rename_column/change_column,详见api文档. 除了对表结构的修改,还可以做任何对数据的修改. 比如导入数据常用的先删掉index,然后再导入, 最后再重建index. <o:p></o:p>

定义好了migration,我们可以执行rake db:migrate更新到最高的版本,或者指定回滚到某个版本: rake db:migrate version=n. migration自动根据当前版本判定该从哪回滚到哪. 在分布环境下,同步代码后只要执行一下就能保证数据库状态也是最新版本. <o:p></o:p>

engine/plugin也能使用migration,比如login engine,在不破坏用户已有数据库内容的条件下添加新的所需数据内容. <o:p></o:p>

另外需要注意的是每次使用migration,db/schema.rb都会被刷新,所有手工对这个文件的修改都会丢失. <o:p></o:p>

migration默认是不支持外键的,原因是一部分数据库如MySQL ISAMSQLite不支持外键,同时外键也会给Railstest fixture导入数据造成麻烦(这个好像有个很麻烦的解决办法)。不过还是有个插件提供了外键的导出(rake db:schema:dump)和导入(rake db:schema:load)(可惜migration中无法正常使用)。 <o:p></o:p>

安装: <o:p></o:p>

<o:p> </o:p>

script/plugin install svn://caboo.se/plugins/atmos/activerecord_foreign_key_extensions<o:p></o:p>

语法: <o:p></o:p>

<o:p> </o:p>

add_foreign_key_constraint table, foreign_key, reference_table, reference_column, :name => optional_constraint_name, :on_update => optional_on_update_action, :on_delete => optional_on_delete_action<o:p></o:p>

分享到:
评论
2 楼 ddtlby 2006-12-26  
不好意思,是我收藏的!如有冒犯之处,请原作者包涵下!
1 楼 jack 2006-12-26  
转载的文章,写上出处,是对原作者的基本尊重,你这样做很不厚道,一没写是转载的,二更没有原文链接

应该像这位兄弟这样写,同样的文章转载,就是写个介绍而已还带原文链接。
http://zidoing.iteye.com/blog/30768


原文链接
http://blogsite.3322.org/jspwiki/pages/viewblog?id=2539

相关推荐

    Ruby on Rails入门例子

    通过`rails generate migration AddTitleToPosts title:string`创建迁移,然后运行`rails db:migrate`执行迁移。 - **ActiveRecord查询接口(Query Interface)**:ActiveRecord提供了丰富的查询API,如`User.find...

    Ruby+for+Rails

    `rails generate migration AddColumnToBooks column:type`会生成一个新的迁移文件,然后通过`rails db:migrate`执行迁移,更新数据库。 7. **路由(Routing)** Rails的路由系统将URL映射到控制器的动作上,定义...

    rails 项目起步示例

    - **Database Migration**:数据库结构的变化会通过迁移文件来实现,运行`rake db:migrate`进行更新。 - ** erb**:ERB(Embedded Ruby)是Rails中的视图模板语言,允许在HTML中嵌入Ruby代码。 - **Helper**:辅助...

    ruby_on_rails 源代码上

    使用`rails generate migration`命令可以创建新的迁移,然后通过`rails db:migrate`命令应用这些变化。 9. **测试驱动开发(TDD)** Rails鼓励使用TDD,提供Rspec和Test::Unit等测试框架。开发者应先编写测试,然后...

    Rails预加载程序Spring-Rails.zip

    Spring是Rails的预加载器。Spring 能够通过保持应用运行在后台,来提升开发模式下的速度。使得不需要在执行test,rake task以及migration时每次都加载。 标签:Spring

    rails配置sqlserver2000

    rails g migration CreateTableName ``` 在生成的迁移文件中编写你的SQLServer 2000兼容的表结构,然后运行迁移: ```bash rails db:migrate RAILS_ENV=sqlserver2000 ``` 如果一切顺利,你现在应该能够使用Rails...

    应用Rails进行敏捷Web开发中文第三版

    2. **数据库迁移**:了解如何使用ActiveRecord的迁移工具(Migration)来修改数据库结构,如添加、删除或修改字段。 3. **路由**:Rails的路由系统如何将URL映射到特定的控制器和动作,以及如何自定义路由规则。 4...

    ruby on rails入门

    - **定义数据库表**:使用 `rails generate migration CreateTodos title:string description:text` 命令来生成迁移文件,然后运行 `rails db:migrate` 来更新数据库。 - **创建控制器**:使用 `rails generate ...

    ruby on rails 教程

    文档深入探讨了Rails中的数据库迁移(Migration)机制,解释了为何要使用Migration,即通过一系列预定义的脚本来更新数据库结构,而不直接修改数据库表。Migration提供了一种安全、可控的方式来管理和记录数据库模式...

    ruby on rails 实例depot

    创建新模型后,使用`rails generate migration`创建迁移文件,定义数据库表的字段和结构,然后运行`rails db:migrate`执行迁移。 6. **控制器(Controllers)**:控制器处理HTTP请求并调用模型进行业务处理。比如,...

    ruby on rails轻松使用

    14. **数据库迁移(Database Migrations)**: 当数据库结构需要变化时,使用`rails generate migration`创建迁移文件,然后通过`rails db:migrate`来执行迁移。 15. **Rails Console**: 交互式的命令行工具,可以...

    ruby on rails开发

    9. **数据库迁移(Database Migration)** Rails使用ActiveRecord库处理数据库操作。在`db/migrate`目录下,你可以编写迁移文件来修改数据库结构。使用`rails db:migrate`命令执行迁移。 10. **测试(Testing)** ...

    rails教程

    7. **数据库迁移**:使用`rails generate migration`创建数据库迁移,可以方便地修改数据库结构,这些更改会在数据库中同步。 8. **erb模板**:Rails中的视图通常由ERB(Embedded Ruby)模板构成,它允许在HTML中...

    rails有用的命令

    `rails g migration AddColumnToTableName column_name:type`会生成一个新迁移,添加指定列到指定表。 9. **Scaffold**: - `rails generate scaffold Product title:string description:text image_url:string`:...

    ruby on rails入门基础

    - 通过创建迁移文件来改变数据库结构,`rails generate migration`命令用于生成迁移,然后在迁移文件中添加数据库操作,最后运行`rake db:migrate`执行迁移。 10. **Scaffolding**: - Rails的scaffolding功能...

    rails-auto-migrate:用于Rails的VSCode扩展,可监视迁移文件夹中的新文件夹,打开最新的迁移文件并自动运行迁移

    要运行迁移,请单击“ Run Rails Migration $ bundle exec rake db:migrate 已知的问题 没有任何 发行说明 1.0.0 最初发布的rails-auto-migrate 1.0.2 修复自动迁移 想要查询更多的信息 享受!

    应用rails进行敏捷web开发

    5. **Rails发电机**:用于自动化生成代码,如model、controller、migration等,提高开发效率。 6. **Migrations**:数据库版本控制,允许开发者以声明式的方式对数据库结构进行修改,便于团队协作和数据库迁移。 7...

    Apress.Beginning.Rails.3

    - **数据库迁移**:使用Rails提供的Migration功能来进行数据库表结构的升级和降级。 - **模板系统**:掌握ERB(Embedded Ruby)模板语法,实现动态页面的渲染。 - **单元测试**:编写测试用例确保代码质量,使用...

    ruby on rails guides for rails4.0.3(英文mobi版)

    从官网上下载的最新的rails4.0.3开发教材。不足之处是mobi版的,需要kindle阅读器,好在这个阅读器也是免费的。

Global site tag (gtag.js) - Google Analytics