## Migration ==描述資料表的樣子 , 記錄資料表演進的過程== 使用 Migrations 可以有記錄地進行資料庫修改, 每次變更就是一筆 Migration 記錄。在沒有 Migration 之前,如果你手動修改了資料庫,那麼你就必須通知其他開發者也進行一樣的修改步驟。 另外,在正式佈署的伺服器上,你也必須追蹤並執行同樣的變更才行。而這些步驟如果沒有記錄下來,就很容易出錯。 Migrations 會自動追蹤哪些變更已經執行過、哪些還沒有, 只要新增 Migration 檔案,然後執行 rake db:migrate - migration方法 ### 新增 Migration 檔案 執行指令,就會在 db/migrate/ 目錄下產生20110203070100_migration_name.rb 的檔案 ``` rails g migration migration_name ``` ### Migration 可用的方法 對資料表做修改: - 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) 修改欄位名稱 - remove_column(table, column) 移除欄位 - change_column(table, column, type, options) 修改欄位的型態(type) - change_column_default(table, column, new_default_value) 變更欄位的預設值 新增、移除索引: - add_index(table, columns, options) 新增索引 - remove_index(table, index) 移除索引 options 可為空,或是`:unique => true`表示這是唯一。 新增、移除外部鍵限制: - add_foreign_key(from_table, to_table, options) - remove_foreign_key(from_table, to_table, options) - migration流程 1. db => migrate 把 table 的欄位建好 可用 scaffold 『建立"使用者功能"』 ``` $ bin/rails generate scaffold User name:string email:string tel:string 簡寫 $ rails g scaffold User name email tel ``` 建立一個表格(table), 裡面有 `name`、`email` 以及 `tel` 三個欄位,分別都是字串(string)型態。在 Rails 專案,這樣的檔案稱之遷移檔(migration file) 2. 把 [[migration方法]] 具現化 , `rails db:migrate` 3. 啟動 Rails Server = `rails s` ,打開瀏覽器,連上網址 [http://localhost:3000/](http://localhost:3000/) 就能看到主頁面 `rails db:migrate 做過之後, 再做第二次 沒有效果 ( Ex . 忘記存檔 , ) 開錯欄位就再做一個新的 migration ``` rails g migration rename_to_subject ``` 到rails API 找rename_column 的方法 (改名) 寫入 RenameToSubject ``` 把title 的欄位更名 subject rename_column(:articles, :title, :subject) ``` 要新增欄位 找add_ 查看 migration 狀態 `rails -T` 在rails 裡可以做的指令 找到 `rails db:migrate:status` 並輸入終端機 ``` status Migration ID MigrationName ----------------------------------------- up 20230713042611 Creat articles down 20230713060646 Rename to subject ``` up : 已經做過 db:migration 了 down : 還沒做過