開啟新的Rails專案以後,第一步就是要資料庫操作開始,也就是產生model檔案。(啥?你不需要用資料庫?那用Rails幹嘛?)由於我剛開始學Rails時對資料庫的概念比較薄弱,因此從基本的地方開始說明一下資料庫是拿來幹嘛用的。
假如今天我們要儲存部落格所有的post,用.html或.rb檔案來儲存是非常沒有效率的,因為這些所有post還要依照開發者的需求來查閱、排序、修改,如果都除存在文字檔案中,用文字搜尋的方法來查找,是極其沒有效率的。
因此我們需要一個專門管理資料的系統,讓我們方便對所有資料進行操作,資料庫裡面是各種表格,就像一堆excel的表格一樣,有了這樣的架構,要查找就方便多了!
如果你真的對資料庫一點概念都沒有,建議可以在下方延伸閱讀或是Wiki、Google上大概了解資料庫的意義及目的。
首先要先知道幾件事情:
如果Rails專案和資料庫是分開的,那如果在本機開發,最後佈署到伺服器上,資料庫的內容會一起佈署過去嗎?答案是不會,因為資料庫是裝在自己的電腦上,如果要一起佈署過去,必須從資料庫裡面複製資料出來,copy到伺服器上的資料庫內,這跟Rails本身就比較沒有關係了。
當我們開始Rails專案開發時,都會先設定一個model,並與資料庫連結產生一個table可供儲存、讀取。通常我們會執行:
$ rails generagte model post content:text
(藍色部分為增加欄位的名稱及屬性,非必要)
這樣子我們就產生了一個叫做post的model,另外也產生了一個migration檔案。要是打開這個檔案,會看到以下畫面:
假如跟Rails不太熟悉,這個畫面其實還不太需要了解細節,但主要要知道,這個檔案就是在描述資料庫內要執行的內容。仔細看內容,會發現使用了create_table這個關鍵字,意思是他要在資料庫中建立一個table叫做posts,就像在excel裡面開一個新的空白表格一樣,用來儲存資料。
有了Migration檔案,代表Rails已經知道該怎麼去操作資料庫了,接下來我們就可以進行Migration。
Migration中文意思是遷居到某個地方,在這邊的概念比較像是我們在Rails專案當中說明我們希望資料庫要進行什麼樣的調整,接著進行migrate這個動作,把這些Rails專案內的描述『遷移』到資料庫當中,實際執行這些描述的內容。
在command line輸入:
$ rake db:migrate
就可以看到Rails跳出幾行訊息,說明migration的狀況。如果沒有錯誤訊息,那我們就成功的修改完資料庫了,可以使用以下指令進行查看。
$ rails console
$ Post.inspect (注意第一個字母大寫)
$ exit (看完以後離開)
就可以看到我們已經在資料庫中有Post這個table,裡面會儲存id和content這些資料。到此就完成Migration了,可喜可賀。
Rails是依照步驟來對資料庫進行操作,已經執行過的Migration就不會再執行。例如現在我們有7個Migration檔案如下:
migrate資料夾當中的所有檔案都是Migration檔案。我們可以利用以下指令新增另一個Migration檔案:
$ rails generate migration add_index_to_posts
(藍色部分自由命名)
這個Migration就會是第8個Migration檔案,也就是說假如我們再執行一次**$ rake db:migrate**那Rails只會執行這第8個檔案,其他先前已經執行過的就不會再執行。
反之,如果資料庫需要回溯,例如發現自己加錯欄位、或是欄位命名錯誤,但我們就必須使用db:rollback指令,將資料庫回到上一個階段,並且修改我們要修改的部份,再利用db:migrate指令重新進行一次Migration。
重點在於,資料庫的更新是依靠Migration,假如今天有20個Migration檔案,那就等於有20個步驟,我們可以利用上一段提到的db:rollback來回溯到較之前的資料庫版本。
所有Migration完成以後都會更新一次schema.rb這個檔案,裡面描述整個資料庫的table和欄位狀況,不管我們的Migration是在哪一個階段,都可以到這個schema.rb檔案當中了解目前資料庫的整體模樣。為什麼需要這個檔案呢?因為每次Migration的檔案都只會紀錄片面的增加、修改、刪除指令,沒辦法看到完整的全貌。如果這個專案需要請人來接手,其他人就可以透過這個schema.rb檔案來檢視資料庫目前的樣貌。
因此,一般來說不會需要更動這個檔案,讓他自動更新即可。
本文同步刊登於我的部落格:特快車