資料庫一直 Error? 教你 Debug 套路
- 第一步,check schema ,是否是你要的資料庫欄位?
- 第二步,check migrate ,是否有按照步驟,建立你的資料庫管理方法?
- 第三步,check migrate , 符合你的欄位和邏輯,就可以刪除以下檔案
1 | rm -rf schema.rb |
1 | rake db:migrate |
rake db:migrate
會歷遍你的每一支 migrate 檔案
- 建立成一個時間戳記(版本)去管控你的 table
Schema
- 塞入資料到
development.sqlite3
教你克服 DB Rake db:migrate
沒有 db migration 數據庫管理
- 每次都要進 console 改數據?
- 改錯了無法退回,怎辦?
- 誰改了也不知道?因為沒記錄
有 db migration 數據庫管理
- 寫 migrate 更動數據
- 可以前進,也可以後退
- 新增的檔案可以被 git 追蹤,有紀錄
數據欄位可以對齊
- 共同協做
- 兩部裝置上開發
常用指令
- rake db:drop db:create db:migrate 俗稱 db 三兄弟
- rake db:reset 重置,會執行 seed 檔
- rake db:seed 做整個專案數據庫初始化,ex:建立管理者权限帐号
- rake db:migrate 往前進一步
- rake db:rollback 往後退一步
Schema 是綱要
- 字打錯,改了沒用
- 記錄版本號
- 知道目前欄位狀況
搭配 annotate 打造一目了然的表
Tips:使用 annotate ,會自動註解在你的 model
檔案 裡面
1 | gem 'annotate' |
- 執行
bundle install
- 再執行
annotate
以後 rake db:migrate
時
針對有修改 model 數庫表的也會自動修改
可以察看目前新建數據庫的狀況
rake db:migrate:status
Up 就是執行完, Down 就是尚未執行
可以建立新的 migration 修改之前的數據庫欄位
關鍵字rename_column
當要修改已經建立的數據庫欄位,不是想著 rollback
因為線上數據有些不能 rollback,且這樣風險很大
建議寫一隻 migration 做改動
1 | Class ChangeColumnName < ActiveRecord::Migration |
指令 rake db:migration 背後做什麼?
進 rails console
1 | rc |
會發現檔案顯示 up
or down
兩個狀態,看下面這支 migration
1 | class AddAddressToUsers < ActiveRecord::Migration |
這邊定義 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 | class DropItemsTable < ActiveRecord::Migration[5.0] |
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概念與用法