前情提要:
Paas(平台及服務)公司Heroku是個可以把我們寫好的App部署到網際網路的好地方。而本篇是我從自己的上一篇文章:將Ruby on Rails專案部署到Heroku遇到的問題,當時困擾了快兩小時,好在搜尋完解法搞定完後,就興奮地延伸為一篇文章了!找到點子寫文章果然是遇到bug的最佳副產品
Heroku的資料庫是使用PostgreSQL,而這篇文章有說明為什麼不用SQLite在Heroku。
但Rails框架在我們的電腦本機rails new app
設定時,為了初學者快速理解學習,預設是SQLite。
所以如果沒有變更資料庫,直接把Rails push到Heroku上去,就會出現問題。
看完這篇資料庫的文章比較,以一句話來大概解釋比較sqlite與PostgreSQL,sqlite缺乏額外優化性能的靈活性,且同一時間只允許一個寫入操作;可擴展的PostgreSQL提供了可靠性和數據完整性,因此是更好的選擇。
[問題]
我在本機的Ruby on Rails專案所用的資料庫是SQLite,當時還未想到之後會部署到Heroku。
因此,在上篇文章做到Step3 >> 步驟 B. 建立Heroku gem
:修改我的本地資料夾裡的gem file,當我新增一個gem叫做'pg'這個步驟時...
問題出現了!本機遇到的錯誤訊息: No connection pool for ActiveRecord::Base
https://stackoverflow.com/questions/38176304/no-connection-pool-for-activerecordbase
[解法]
/config/Gemfile
Pg
套件,讓我們在Ruby上使用關聯式資料庫PostgreSQL的介面的好幫手。
(Pg套件詳細資料: https://bitbucket.org/ged/ruby-pg/wiki/Home )
我們可以/config/Gemfile
加上這幾行程式碼,
讓在Heroku上線時候跑的是PostgreSQL,而在本機的時候還是跑SQLite。
Rails 應用程式預設提供了三種不同的執行模式:
development environment:開發模式,用在你的開發的時候
test environment: 測試模式,用在執行測試程式時
production environment: 正式上線模式,用在實際的上線運作環境
group :production do
gem 'pg'
end
group :development, :test do
gem 'sqlite3'
end
或是寫成:
gem 'sqlite3', group: :development
gem 'pg', group: :production
[注意]
gem 'pg'
後面要加逗號,
啊!不然就會向我一樣出現Syntax error...
欣慰的是,用錯誤訊息搜尋關鍵字,發現在stackoverflow上也有人跟我犯過同樣的錯誤 XD
https://stackoverflow.com/questions/18684527/gemfile22-syntax-error-unexpected-tidentifier-expecting-end-of-input
bundle install
,再重啟rails server。記得,每次在Gemfile修改套件資料,都要跑bundle install
處理套件相依性問題。
(如果你在本機,想避免安裝任何在production環境下跑的gem,可輸入:bundle install --without production
)
而每次跑完bundle都要先用control+ c
關掉Terminal頁面的伺服器,
再重啟伺服器rails s
之後,如下圖:localhost資料庫的問題已解決了:
但你還是看不到首頁的資料:
git push heroku master
最後兩步:push!git push heroku master
,
還要跑完heroku rake db:migrate
指令才會生效喔!
(如果轉換資料庫之前有些bug,run指令的時候會提示哪些欄位可能出了問題。)
首頁成功顯示資料庫!
==
後記:
遇到這個bug讓我提早了解跟ruby on rails相關的資料庫概念,是一個很有價值的坑(?)!
如果你想在本機建立rails app的當下,直接設定成PostgreSQL而非SQLite(節省之後deploy的麻煩~),可以參考這篇文章:
Rails 使用 PostgreSQL
Ref:
第二十三天:認識資料庫
很棒的挑戰唷。新手常見的錯誤當中還有一個是搞不清楚資料庫版本與程式碼版本的關係,感覺以後會遇到呢
感謝~找到你說的這個資料庫版本部分的說明唷!
Rails 提供一系列 rake 任務來執行 migrations。第一個跟 migration 有關的 rake 任務是 db:migrate。它的用法,最基本的,就是單純的執行所有還沒執行 migraitons 的 up 方法。若所有 migrations 都執行過了,它就會直接結束。
執行 db:migrate 也會一起執行 db:schema:dump,去更新 db/schema.rb 檔,以便跟資料庫的結構相吻合。
如果你要 migrate 到某個特定版本,Active Record 會執行所需的 migrations(可能是 up 或 down),直到到達那個版本為止。所謂版本,就是 migrations 檔名的前置數字