rails : migration 使用
2014-04-03 16:12
405 查看
有时你在写迁移任务的时候可能会不小心写错,如果你已经执行了这个迁移任务,那么,你就不能单纯地把它修改一下再重新执行一次,Rails会认为这个迁移任务已经执行过了,所以执行rakedb:migrate时不会做任何操作。你应该先把写错的那个迁移任务回滚(可以执行rakedb:rollback),然后修改你的migration再执行rakedb:migrate去执行正确的版本。
migration_name常見的命名方式有
[/code]
railsgeneratemodelProductname:stringdescription:text
railsgeneratemigrationAddPartNumberToProducts
railsgeneratemigrationAddPartNumberToProductspart_number:string
railsgeneratemigrationRemovePartNumberFromProductspart_number:string
對資料表做修改:
create_table(name,options)新增資料表
drop_table(name)移除資料表
rename_table(old_name,new_name)修改資料表名稱
change_table修改資料表欄位
個別修改資料表欄位:
add_column(table,column,type,options)新增一個欄位
rename_column(table,old_column_name,new_column_name)修改欄位名稱
change_column(table,column,type,options)修改欄位的型態(type)
remove_column(table,column)移除欄位
新增、移除索引:
add_index(table,columns,options)新增索引
remove_index(table,index)移除索引
記得將所有外部鍵foreignkey加上索引
新增一個Migration檔案
railsgmigrationmigration_name
migration_name常見的命名方式有
Add欄位名To表格名或是
Remove欄位名From表格名,不過這沒有一定,能描述目的即可。
[/code]
railsgeneratemodelProductname:stringdescription:text
railsgeneratemigrationAddPartNumberToProducts
railsgeneratemigrationAddPartNumberToProductspart_number:string
railsgeneratemigrationRemovePartNumberFromProductspart_number:string
對資料表做修改:
create_table(name,options)新增資料表
drop_table(name)移除資料表
rename_table(old_name,new_name)修改資料表名稱
change_table修改資料表欄位
個別修改資料表欄位:
add_column(table,column,type,options)新增一個欄位
rename_column(table,old_column_name,new_column_name)修改欄位名稱
change_column(table,column,type,options)修改欄位的型態(type)
remove_column(table,column)移除欄位
新增、移除索引:
add_index(table,columns,options)新增索引
remove_index(table,index)移除索引
記得將所有外部鍵foreignkey加上索引
Rails中的型態 | 說明 | MySQL | Postgres | SQLite3 |
---|---|---|---|---|
:string | 有限長度字串 | varchar(255) | charactervarying(255) | varchar(255) |
:text | 不限長度文字 | text | text | text |
:integer | 整數 | int(4) | integer | integer |
:float | 浮點數 | float | float | float |
:decimal | 十進位數 | decimal | decimal | decimal |
:datetime | 日期時間 | datetime | timestamp | datetime |
:timestamp | 時間戳章 | datetime | timestamp | datetime |
:time | 時間 | time | time | datetime |
:date | 日期 | date | date | date |
:binary | 二進位 | blob | bytea | blob |
:boolean | 布尔值 | tinyint | boolean | boolean |
:references | 用來參照到其他Table的外部鍵 | int(4) | integer | integer |
SQLTypeRubyClass
int,integerFixnum
decimal,numericFloat
clob,blob,textString
interval,dateDate
float,doubleFloat
char,varchar,stringString
datetime,timeTime
Boolean-
有一个潜在的可能是关于decimal的,在数据库里,使用decimal的列来存储number和fixnumber型,ActiveRecord将decimal映射成Float类的对象,尽管这样可以应用于大多数应用,浮点数是不精确的,在对这一类型的属性进行一系列操作的时候,可能会发生舍入的错误,你也许可以使用integer类型来作为替代方案,例如,存储货币型的时候可以将元,角,分,分别存入不同的字段。做为一种选择,你可以使用聚合(aggregations),使用多个分开的字段来构建货币类型。
另外,欄位也還有一些參數可以設定:
:null是否允許NULL,預設是允許
:default預設值
:limit用於string、text、integer、binary指定最大值
Migration搭配的Rake任務
rakedb:create依照目前的RAILS_ENV環境建立資料庫rakedb:create:all建立所有環境的資料庫
rakedb:drop依照目前的RAILS_ENV環境刪除資料庫
rakedb:drop:all刪除所有環境的資料庫
rakedb:migrate執行Migration動作
rakedb:rollbackSTEP=n回復上N個Migration動作
rakedb:migrate:upVERSION=20080906120000執行特定版本的Migration
rakedb:migrate:downVERSION=20080906120000回復特定版本的Migration
rakedb:version目前資料庫的Migration版本
rakedb:seed執行db/seeds.rb載入種子資料
如果需要指定Rails環境,例如production,可以輸入RAILS_ENV=productionrakedb:migrate
bulk參數
:bulk=>true可以讓變更資料庫欄位的Migration更有效率的執行,如果沒有加這個參數,或是直接使用
add_column、
rename_column、
remove_column等方法,那麼Rails會拆開SQL來執行
要变更现有的数据表,可以用create_table的类似方法change_table。它的用法跟create_table差不多,但它的代码块有更多的方式。例如:
change_table :products do |t| t.remove :description , :name t.string :part_number t.index :part_number t.rename :upccode , :upc_code end |
在一些情况下,Rails会知道如何去恢复所做的改变,使用change方法可以让我们不用同时写up和down方法。目前来说change方法只支持以下migration的定义:
add_column
add_index
add_timestamps
create_table
remove_timestamps
rename_column
rename_index
rename_table
如果你需要使用其他方法,那么你就不能使用change方法而需要同时写up和down方法。
Migration里面的down方法能复原up方法所造成的变更。也就是说如果执行了up然后再执行down,那么数据库的schema应该会没有改变。所以说,如果用up建立一个数据表,就应该在down方法中删除它。明智的做法会使用跟up完全相反的顺便来做这些事情。
Rails提供一系列rake任务来执行migrations。第一个跟migration相关的rake任务是rakedb:migrate。它最基本有用法就是单纯地执行所有还没执行migrations的up或者change方法。若所有migrations都执行过了,它就会直接结束。执行的顺序是按照migration的日期。
值得注意的是执行db:migrate也会一起执行db:schema:dump,去更新db/schema.rb文件,以便跟数据库的结构同步。
如果你要migrate到某个特定版本,ActiveRecord会执行所需的migrations(up,down,change)直到到达指定的版本为上。所谓版本就是migration文件名前面的那串数字。例如要迁移到版本20080906120000,只需执行:
$rakedb:migrateVERSION=20080906120000 |
rakedb:rollback
如果你需要执行一个指定的migration的up或down方法,那么你可以用db:migrate:up和db:migrate:down这两个任务。你只需指定版本号,就可以触发它的up或down方法:
$rakedb:migrate:upVERSION=20080906120000 |
相关文章推荐
- rails : migration 使用
- Rails中activeAdmin的使用
- 使用Nginx + unicorn搭建ruby on rails的生产环境
- 【Ruby】Ruby框架的使用(Ruby on Rails项目结构分析)
- SQL Server Migration Assistant for MySQL使用方法
- 使用 Ruby on Rails 和 Eclipse 开发 iPhone 应用程序,第 1 部分:为 iPhone 提供内容
- 部署之使用 mina 来部署 Ruby on Rails 应用之基础
- Rails Production Server @ Nginx + Postgresql + Ubuntu 使用git远程部署 配置
- windows 安装使用vim,及安装插件spark和rails.vim ,来作为ruby on rails 开发IDE
- 基于rails的schedule网站开发(3):如何使用MySql开发(?)
- rails使用bootstrap3-wysiwyg可视化编辑器并实现自定义图片上传插入功能
- 如何在Ruby On Rails中使用Unicode(解决数据库中文化的问题)
- Rails使用PostgreSQL在Heroku上部署
- 二、使用rails3.0自带的数据检查功能检查输入数据
- rails使用memcache缓存session
- rails中使用富文本编辑器fckeditor
- 使用swift和rails来实现ios账号系统
- 强烈推荐学习rails的书籍(该书使用rails 3.2.1,并且随着rails升级而升级)
- 如何在 Rails 中搭配 Turbolinks 使用 Vue
- 在rails3 中使用 i18n来做国际化处理