ActiveRecord Command Line基本操作指令

db

Commaned Line常用指令列表

在Rails資料夾底下,執行以下指令,就可以針對資料庫有不同操作,記得前面要加上rake:

  • db:create 在目前環境當中產生一個空白的資料庫
  • db:create:all 在所有環境當中產生空白資料庫
  • db:drop 刪除目前環境的資料庫
  • db:drop:all 刪除所有環境的資料庫
  • db:migrate 依照未執行過的migration檔案更新資料庫
  • db:migrate:up依照未執行過的migration,執行一次migration更新資料庫
  • db:migrate:down 依照已執行過的migration,退回一次migration
  • db:migrate:status 顯示目前migration到哪個地步
  • db:rollback 退回一次migration
  • db:forward 更新一次schema檔案
  • db:seed 執行 seed.rb 檔案
  • db:schema:load 依照目前schema.rb檔案架構資料庫
  • db:schema:dump 依照資料庫架構現況重繪一份schema.rb
  • db:setup 執行 db:schema:load, db:seed
  • db:reset 執行 db:drop db:setup
  • db:migrate:redo 執行 db:migrate:down db:migrate:up
  • db:migrate:reset 執行 db:drop db:create db:migrate

如何產生migration檔案以及操作說明

一下列出那麼多指令,想必也很難消化。本篇簡單說明幾個常用指令,讓各位大概了解操作情況。

如何開新的資料庫

一般來說是在執行$ rake db:migrate時,Rails就會自動去開啟新的資料庫了。除非你有執行過db:drop指令,並且需要一個全新乾淨的資料庫,才會使用

$ rake db:create

撰寫完migration檔案以後資料庫就會直接更動了嗎?

可惜不會,必須使用db:migrate指令,資料庫才會進行更新。請看下方。

利用rake指令進行migrate

在創造一個model或migration以後,必須進行migrate指令,才能啟動rails server,否則會出現Migration Pending的錯誤。也就是說Rails server必須在資料庫已完全更新的情況下才能使用。

$ rake db:migrate

他會依照我們在migration檔案中的描述來更動資料庫,例如新增或刪除欄位。

啊...寫錯了...可以回復嗎?

1. $ rake db:rollback (倒車,回到剛剛的狀態) 2. 修改程式碼 3. $ rake db:migrate (重新進行一次migrate)

有另一種替代方案是直接產生新的migration檔案進行修改,但由於未來migration檔案會越來越多,強烈不建議這麼做。簡單的狀況最好就用rollback解決就好,就像活到一定歲數以後就會覺得錢能解決的事情都是小事一樣。

不過並非所有migration都可以直接rollback,詳細撰寫方法可參考後續文章。

資料一筆一筆加好麻煩,有沒有快速方法?

一般來說都是在網頁介面中新增資料,但如果已經有知道要新增的資料,那可以到seed.rb這個檔案中新增,利用create方法可以將東西都寫出來,接著在command line中執行:

$ rake db:seed

他就會去執行seed.rb檔案,將檔案新增到資料庫中。裡面的寫法大概如下:

當然你要寫任何Ruby code都可以,不過根據Rails convention,這個檔案就是專門處理資料庫的,寫些有的沒的只會讓維護更困難而已。

資料庫死不讓我改,可以清掉全部內容嗎?

$ rake db:drop db:create db:migrate

首先,migration指令是可以串在一起執行的。db:drop會將資料庫整個刪除,然後db:create會開啟一個全新且乾淨的資料庫,並且執行migrate。裡面會什麼資料也沒有。

悲劇,整個玩壞了,怎麼救?

同上,但記得如果migration檔案內有衝突,會讓migrate失敗,記得先把這些衝突清乾淨。例如下了一個delete_column去刪除一個不存在的欄位就會產生錯誤,要把這類的code刪去。

不過記得,不管使用哪一個reset方法,一定會把資料庫清空,所以如果有需要的資料,務必要先從資料庫備份出來。

為何migrate遇到錯誤,改了以後還是錯?

在migration當中有一個很容易遇到的錯誤是重複跑同一個migrate檔案,結果已經執行過的指令產生衝突,例如:

add_column :post, :content, :text
delete_column :post, :commennt

第一行我們要在post這個tabel新增一個欄位叫做content;第二行是要在post這個table刪除comment這個欄位。

執行db:migrate時,跳出『找不到要刪除的欄位commennt』錯誤,這時我們才發現打錯字了!應該要刪除的是comment欄位,打錯成commennt欄位!

注意!接下來即便我們改完錯字,再執行一次db:migrate,他會跳出另一個錯誤說『content欄位已經存在』。為什麼?因為第一次執行時,第一行add_column已經執行過了,就算遇到錯誤,已經執行過的code就不會再倒車回去,讓資料庫呈現一個『做一半』的狀態。所以第二次再執行時,他會發現資料庫裡面已經有了一個content欄位,導致無法再新增一個重複的。

這時候,請將第一行add_column刪除,執行db:migrate,然後再把第一行加回去,就解決這個問題了。

但為什麼要加回去呢?如果已經解決,那其實就不用再加回去了吧?

因為我們要保持整個migrate程序可以完整跑完,假如有另一個開發者需要使用同樣的資料庫結構,但我們把addcolumn這行拿掉,他跑了db:migrate指令結果並沒有執行addcolumn這個指令,那他的資料庫就少了一個欄位,造成後續的migration錯誤。

啥?叫他改用db:schema:load嗎?請不要造成其他人的困擾...

db:schema指令是做什麼用的?

其實這個指令開發者不太常使用到,因為是包含在db:migrate和其他指令當中的。主要有兩個指令:

$ rake db:schema:load

我們在進行migration時,Rails會依照尚未執行的migration檔案來進行資料庫操作,並寫用現有的資料庫建構出一個schema.rb檔案,如果我們打開這個檔案,就會看到裡面有我們整個資料庫的table、欄位、屬性等詳細資料。

因此,rake db:schema:load這個指令會依照schema.rb檔案裡面的描述,把資料庫裡面建構成schema.rb裡面指定的模樣。注意,他純粹只有建構而已,裡面並不會有任何資料,而且任何既存的資料都會被清除。

為什麼這個指令我們不會用到呢?因為不管是新增資料庫、打掉重練,都已經將這個指令包含在裡面,也就是說不管是db:reset、db:setup,都會執行這個指令。一般來說我們不用特別把這個指令再拿出來執行一次。

Stackoverflow上也有相關討論。

$ rake db:schema:dump

Stackoverflow當中有提到,db:schema:dump其實是db:migrate裡面程序的一環,也就是說進行rake db:migrate時,會進行以下幾個動作:

1. 依照所有migration檔案進行資料庫調整 2. 依照資料庫現在的模樣,寫一份schema.rb檔案,描述資料庫內現在的狀況

也就是說,他和db:schema:load的順序是相反過來的,一般來說都是包含在migrate指令裡面,同樣也不需要再拿出來執行一次。除非...真的有狀況我們把schema.rb改壞了(誰沒事要去改那個檔案?),然後也沒有做版本控制(誰到今天了還不做版本控制?),那我們就會需要這個指令。否則...先看看就好。


延伸閱讀

Rails Guide: Migration

完整指令表

CC授權圖片:barrymieny