[Rails] learn rack db:migrate

資料庫一直 Error? 教你 Debug 套路

  • 第一步,check schema ,是否是你要的資料庫欄位?
  • 第二步,check migrate ,是否有按照步驟,建立你的資料庫管理方法?
  • 第三步,check migrate , 符合你的欄位和邏輯,就可以刪除以下檔案
1
2
rm -rf schema.rb
rm -rf development.sqlite3
1
rake db:migrate

rake db:migrate 會歷遍你的每一支 migrate 檔案

  1. 建立成一個時間戳記(版本)去管控你的 table Schema
  2. 塞入資料到 development.sqlite3

教你克服 DB Rake db:migrate

沒有 db migration 數據庫管理

  1. 每次都要進 console 改數據?
  2. 改錯了無法退回,怎辦?
  3. 誰改了也不知道?因為沒記錄

有 db migration 數據庫管理

  1. 寫 migrate 更動數據
  2. 可以前進,也可以後退
  3. 新增的檔案可以被 git 追蹤,有紀錄

數據欄位可以對齊

  1. 共同協做
  2. 兩部裝置上開發

常用指令

  1. rake db:drop db:create db:migrate 俗稱 db 三兄弟
  2. rake db:reset 重置,會執行 seed 檔
  3. rake db:seed 做整個專案數據庫初始化,ex:建立管理者权限帐号
  4. rake db:migrate 往前進一步
  5. rake db:rollback 往後退一步

Schema 是綱要

  1. 字打錯,改了沒用
  2. 記錄版本號
  3. 知道目前欄位狀況

搭配 annotate 打造一目了然的表

Tips:使用 annotate ,會自動註解在你的 model檔案 裡面

1
gem 'annotate'
  1. 執行 bundle install
  2. 再執行 annotate

以後 rake db:migrate
針對有修改 model 數庫表的也會自動修改

可以察看目前新建數據庫的狀況

rake db:migrate:status
Up 就是執行完, Down 就是尚未執行

可以建立新的 migration 修改之前的數據庫欄位

關鍵字rename_column

當要修改已經建立的數據庫欄位,不是想著 rollback
因為線上數據有些不能 rollback,且這樣風險很大
建議寫一隻 migration 做改動

migrate**/****change_column_name.rb
1
2
3
4
5
Class ChangeColumnName < ActiveRecord::Migration
def Change
rename_column :table_name, :old_column, :new_column
end
end

指令 rake db:migration 背後做什麼?

進 rails console

1
2
rc
rake db:migration:status

會發現檔案顯示 up or down兩個狀態,看下面這支 migration

1
2
3
4
5
6
7
8
9
class AddAddressToUsers < ActiveRecord::Migration
def up
add_column :users, :address, :string
end

def down
remove_column :users, :address
end
end

這邊定義 up / down ,可以很清楚知道
method#up 會新增欄位,method#down 會移除欄位
而我們在更詳細說明:
rake db:migrate 會把沒做過的 migration up 都執行一次
rake db:rollback 只會執行最近一次的migration down

migration 既可以 add_column 也可以 drop_table
所以千萬要小心:migration 要做好可以 rollback 的措施,也就是可逆
以免網站 deploy 更新發聲倒站,或者他人合併的分支要回溯,結果資料已不復返

舉例:移除舊表單和資料庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DropItemsTable < ActiveRecord::Migration[5.0]
def up
drop_table :items
end

def down
create_table :items do |t|
t.string :name
t.text :description
t.string :state
t.text :note
t.string :logo
t.timestamps
end
end
end

Ps.drop_table 會連資料一起殺掉,不只是欄位
可以嘗試 rake db:rollback 看 schema 是否只是時間戳記不同而已
是的話就是已經復原欄位,做到可逆了(資料只能 say byebye…)

如何清空 heroku 上的 db?

清空资料

1
heroku pg:reset DATABASE_URL

执行 migrate 新增栏位

1
heroku run rake db:migrate

执行 seed 预设填入的资料

1
heroku run rake db:seed

Ref
How to empty DB in heroku
Rails DB Migration - How To Drop a Table?
這篇講得很好:Ruby on Rails-談Migration概念與用法

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×