在《Ruby on Rails,rake工具使用和数据库migrations迁移的概念》中,我们知道Rails中进行数据库迁移操作的基本概念和重要性。现在着手进行一个简单的数据库迁移实践吧。

所有的数据库迁移文件存放在simple_cms/db/migrations目录中,在之前我们没有做过创建迁移的操作所以这个目录还没有生成。

有两种方式来创建迁移工作,其一是创建模型的时候自动生成迁移文件,其二是直接创建迁移文件。

创建模型的同时生成迁移文件:

在simple_cms应用的根目录中,执行创建模型的命令。其中User是要创建的模型的名字(注意模型的命名一般来说是单数形式,创建出来的表自动是复数形式),如此做会在创建User模型的同时创建出迁移文件。回显提示创建出了名为“YYYYMMDDHHMMSS_create_users.rb”,以时间开头下划线分割每个单词的格式。

E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate model Userinvoke  active_recordcreate    db/migrate/20120613163730_create_users.rbcreate    app/models/user.rbinvoke    test_unitcreate      test/unit/user_test.rbcreate      test/fixtures/users.yml

我们注意到从Rails3.1版本之后,生成的迁移文件中使用了更智能的change方法来代替传统的up和down方法。推荐只在change方法中加入与数据库结构相关的操作,这样即使不写回滚方法Rails也能在收到回滚命令时做出正确的操作,简直太贴心了!
class CreateUsers < ActiveRecord::Migrationdef changecreate_table :users do |t|t.timestampsendend
end

还可以直接创建迁移文件:在simple_cms应用的根目录中,执行创建迁移的命令。
E:\greensoft\RailsInstaller\Sites\simple_cms>rails generate migration DoNothinginvoke  active_recordcreate    db/migrate/20120613163818_do_nothing.rb

打开simple_cms/db/migrations/20120613163818_do_nothing.rb,里面只有两个空方法up,和down分别对应执行这个版本的迁移和回滚这个版本的迁移。现在这个文件正如我们在名字里暗示的一样,执行迁移和回滚都是空方法什么都不干。
class DoNothing < ActiveRecord::Migrationdef upenddef downend
end

这时候我们就有了两个迁移文件,通过执行迁移工作可以让迁移文件中描述的结构及数据作用到数据库中。在执行迁移之前先看一下数据库,除了记录数据库版本的schema_migrations表之外什么都没有。
C:\Windows\system32>mysql -u abbuggy -p simple_cms_development
Enter password: *******
...
mysql> SHOW TABLES;
+----------------------------------+
| Tables_in_simple_cms_development |
+----------------------------------+
| schema_migrations                |
+----------------------------------+
1 row in set (0.00 sec)mysql> 

执行迁移命令,没有参数的rake db:migrate会将没有执行过的迁移文件按照时间顺序执行一遍。CreateUsers的作用是创建一个叫做users的表,DoNothing什么都不干。 
E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate
==  CreateUsers: migrating ====================================================
-- create_table(:users)-> 0.4120s
==  CreateUsers: migrated (0.4120s) =============================================  DoNothing: migrating ======================================================
==  DoNothing: migrated (0.0000s) =============================================E:\greensoft\RailsInstaller\Sites\simple_cms>

看看schema_migrations表,这个表只有一个列version,两个记录分别是刚才执行的两个迁移文件名前面的版本号。这个表就是记录目前为止执行过的迁移文件的版本用的。每当执行迁移命令,这个表都会做出相应的记录,这样我们就知道那些迁移文件已经执行,哪些是未曾执行的。

mysql> select * from schema_migrations;
+----------------+
| version        |
+----------------+
| 20120613163730 |
| 20120613163818 |
+----------------+
2 rows in set (0.02 sec)mysql> 

再去看看 simple_cms/db/schema.rb,与之前对比增加了users表的定义。这个文件的内容与当前数据库的结构保持一致。version的值就是最后一个迁移文件的版本。

ActiveRecord::Schema.define(:version => 20120613163818) docreate_table "users", :force => true do |t|t.datetime "created_at", :null => falset.datetime "updated_at", :null => falseend
end

在迁移命令后面指定版本号可以前往或回滚至指定的版本,如果输入版本号为0,回到数据库的初始状态。
E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate VERSION=0
==  DoNothing: reverting ======================================================
==  DoNothing: reverted (0.0000s) ===============================================  CreateUsers: reverting ====================================================
-- drop_table("users")-> 0.1410s
==  CreateUsers: reverted (0.1420s) ===========================================

刚才创建的表被清除。 
mysql> SHOW TABLES;
+----------------------------------+
| Tables_in_simple_cms_development |
+----------------------------------+
| schema_migrations                |
+----------------------------------+
1 row in set (0.00 sec)

迁移版本归零
mysql> select * from schema_migrations;
Empty set (0.00 sec)

指定某一个版本rake db:migrate VERSION=20120613163818命令将数据库前往至20120613163818执行后的状态。这里要注意,这里的“前往至”指的是从当前的版本开始执行迁移文件,直到指定的版本。换句话说,如果当前的版本为0,手头有5个迁移文件分别是1,2,3,4,5。rake db:migrate VERSION=3意味着将按顺序分别执行1,2,3版本的迁移。
E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate VERSION=20120613163818
==  CreateUsers: migrating ====================================================
-- create_table(:users)-> 0.1770s
==  CreateUsers: migrated (0.1780s) =============================================  DoNothing: migrating ======================================================
==  DoNothing: migrated (0.0000s) =============================================

如果只想执行某一个版本的迁移工作,需要使用rake db:migrate:up VERSION=xxx或rake db:migrate:down VERSION=xxx命令。比如我们可以直接执行rake db:migrate:down VERSION=20120613163730。这个命令是创建users表的逆过程,也就是删除users表。我个人觉得单独执行某一个迁移文件这不是一个明智的行为,因为有可能中间没有执行的某个迁移会影响最终的结果使得表结构或内容不同步。
E:\greensoft\RailsInstaller\Sites\simple_cms>rake db:migrate:down VERSION=20120613163730
==  CreateUsers: reverting ====================================================
-- drop_table("users")-> 0.0630s
==  CreateUsers: reverted (0.0660s) ===========================================

最后说说迁移文件名开头的时间戳,也就是迁移文件的版本。为什么要用一个精确到秒的时间作为迁移文件的版本呢?如果Bob早上10点创建了一个模型同时生成了当时为版本的迁移文件,后来Tom下午五点创建了另一个迁移文件。他们两个人之后分别检出代码并执行数据库迁移db:migrate时,Rails会自动按照顺序执行迁移操作保证数据库状态正确。时间版本能让团队中开发人员创建的迁移文件能够按照顺序执行,减少冲突的可能。 

不得不提的是,迁移文件只能是减少冲突,并不能完全解决冲突,更不能完全代替团队之间的沟通。如果Tom下午的迁移工作所操作的内容已经被Bob在上午的迁移工作中移除了,错误肯定是不可避免了。

关于错误回滚,有时候可能因为书写或是其他原因,迁移文件执行错误。这时候如果直接修改迁移文件至正确状态后重新执行肯定是不行的,因为Rails记录的当前迁移版本和修改的迁移文件版本相同,执行不了。正确的作法是将库回滚至上一版本后再次执行修改过的迁移文件。

转载于:https://www.cnblogs.com/abbuggy/archive/2012/06/14/2594212.html

Ruby on Rails,创建和执行migrations迁移文件相关推荐

  1. yii 执行指定迁移文件_laravel的迁移文件

    1. 迁移是什么? 迁移就像是对数据库进行的版本控制,让你的团队能够轻松地去定义和共享程序的数据库结构.迁移通常配合 Laravel 的结构生成器,可以轻松生成应用程序的数据库结构.如果团队中有个成员 ...

  2. springBoot 怎么利用maven 创建可以执行的jar文件?

    欢迎关注博主公众号:[纯洁的明依]文章由陈晓阳原创. 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料. 1 为了可以使用maven 创建可执行的jar文件 ,首先需要再pom.x ...

  3. yii 执行指定迁移文件_MySQL迁移PG工具pymysql2pgsql

    阅读使人充实,讨论使人敏捷,写作使人精确.  迁移工具简介 今天介绍一个MySQL迁移PostgreSQL的自动化工具py-mysql2pgsql,该工具通过python使用不落地方式,或写出到文件方 ...

  4. ruby on rails 之 延时执行代码

    最近因为项目需要,所以找了一下关与代码延时执行的问题. 在网上找的大部分的资料都是关于定时任务.这个很好弄,只需要安装一个gem包就完全可以做了.但是,我需要的是在程序接收到这个消息的时候延时5s或者 ...

  5. yii 执行指定迁移文件_Web 云开发 · 云开发数据库迁移指南

    云开发数据库 云开发为我们提供了一个 JSON 文档型数据库(NoSQL),并集成了 「增删改查」 等 API,操作方便,简单易懂.并且相比传统数据库而言它具有「高性能的数据库读写服务」,「可以直接在 ...

  6. Linux下创建可执行bin安装文件

    需求及应用场景 1.简化操作.一般的软件安装过程,如果想要精简步骤,我们一般会将需要在命令行中输入的命令写成一个脚本,同时将安装介质准备好.我们将脚本和安装介质上传到生产环境,然后通过执行脚本来完成安 ...

  7. Ruby on Rails,创建模型,附赠模型与表名不一致时的解决方法

    在前文<Ruby on Rails,创建和执行migrations迁移文件>中我们提到过创建模型的事情,我们创建模型的同时生成迁移文件.那时候我们关注的是迁移文件,现在我们把目光投向模型这 ...

  8. 如何在Ruby on Rails迁移中重命名数据库列?

    我错误地将列命名为hased_password而不是hashed_password . 如何使用迁移重命名此列来更新数据库架构? #1楼 如果当前数据对您不重要,您可以使用以下方法删除原始迁移: ra ...

  9. ruby on rails_最终的中级Ruby on Rails教程:让我们创建一个完整的应用程序!

    ruby on rails 由Domantas G (By Domantas G) There are plenty tutorials online which show how to create ...

最新文章

  1. Gridview][UpdateCommand的写法要点]
  2. php 记录用户行为路径,用户行为路径分析方法
  3. 《仙剑奇侠传7》试玩版战斗系统拆解与分析
  4. Main函数中的argc和argv应用举例
  5. 【渝粤教育】国家开放大学2018年春季 0007-22T文书档案管理 参考试题
  6. java学习(174):constructor类反射编程
  7. LeetCode 1340. 跳跃游戏 V(DP)
  8. ajax post 请求 一直提示 404 not found textStatus error
  9. 手把手教你从0到1进行Java项目实践
  10. 面向程序员的GPGPU技术系列(1) 为什么要理解GPU体系结构?
  11. Android实现传感器应用及位置服务
  12. Android开发高级进阶之Android开发艺术探索笔记重要知识点
  13. 美国计算机生物学要求,美国卡耐基梅隆大学计算机生物学专业.pdf
  14. 什么因素影响无刷马达绕线机的精度
  15. 解决undefined reference to `WinMain'
  16. 求饶不经过原点的旋转轴的旋转矩阵
  17. 搬寝室 ----- 动态规划
  18. vue移动端用什么数据可视化插件_vue框架大屏可视化
  19. 为何我们要离职?---一个程序猿的社会学感悟
  20. OpenStack八大核心组件精讲之---swift

热门文章

  1. Monkey King-左偏树
  2. 常见嵌入式硬件部分面试题总结
  3. Azure Queues and Service Bus Queues - Compared and Contrasted
  4. 利用python的docx模块处理word和WPS的docx格式文件
  5. Jmeter Springboot Redisson分布式锁并发订单操作(下单、取消单、完成单、加库存)
  6. Android面试题,framework源码
  7. web项目发布到iis中readystate一直处于 interactive_Framer Web 发布后,终于像个正经的设计软件了。...
  8. HashMap引发死链问题(HashMap、ConcurrentHashMap原理解析)
  9. mock.js的使用
  10. 软件测试 学习之路 SQL语言及navicat使用