`
苹果侠
  • 浏览: 11365 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Rails中的Migrations(一)

阅读更多

Rails中的DB Migration是通过db/migrate下的rb脚本来完成的。这些migrate的脚本可以通过手动来维护,但是推荐的方法应该让Rails自己来生成相应的rb文件。在Rails中有两种方式来生成:

   1. 使用generator生成model时,同时生成对应这个model的migrate文件。例如:ruby script/generate model discount。(如果使用--skip-migration的选项则不会生成相应的migrate文件)
   2. 直接使用generator来生成migrate文件,例如:ruby script/generate migration add_price_column。
migrate 文件的名称有14位的数字开头,即所谓的UTC时间(起首4位数字表示年份,然后以5组2位数字分别表示月份,日期,小时,分钟,秒数)加下划线,加上这个文件中使用的类的名称。类名称中的单词以下划线分隔。如果该migrate文件是由generate model产生的,则名称为create_加上model的复数形式。如果是由generator直接产生的则以generate命令后的参数决定。(例如:ruby script/generate migration add_price_column中产生的名称就为add_price_column)。

 

rake db:migrate

 

Rails在数据库中会维护一张 表:schema_migrations。这张表中只有一个字段:version,里面存储的是db/migrate目录下的已经成功执行的 migrate的文件的UTC编号。当执行rake db:migrate是,Rails会查看数据库中有没有schema_migrations这张表,如果没有就会建立这张表.然后会取出这张表中的所有 的记录,即UTC编号,与db/migrate目录下的文件进行比较.如果db/migrate目录下存在数据库中没有记录的migrate文件,就会按 照顺序进行执行,并在数据库中插入相应的记录.

执行某个特定的migrate文件

 

如果需要执行db/migrate目录下的某个特定的migrate文件,可以使用VERSION参数,例如rake db:migrate VERSION=20080601000010
如果使用VERSION执行某个特定的migrate文件时,Rasil会按照以下的顺序进行工作:
当指定的VERSION参数比schema_migrations表中存储的最大UTC还要大,则会直接执行制定VERSION的那个migrate文件.
当指定的VERSION参数比schema_migrations表中存储的某些记录小,情况则会有些不同.Rails会从数据库中找出那些UTC编号比制定VERSION大的那些记录,并按照UTC编号从大到小undo 这些migrate文件.

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics