隨著Rails 6的發(fā)布,宣布的新功能之一是對多個數(shù)據(jù)庫的支持。那么如何在Rails 6中管理多個數(shù)據(jù)庫?當(dāng)我們在一個應(yīng)用程序中,努力有效地管理獨立的DB時,會讓你大吃一驚。人們想要Rails 6支持多個數(shù)據(jù)庫的原因有很多,使用SQL數(shù)據(jù)庫存儲用戶數(shù)據(jù),使用NoSQL存儲位置數(shù)據(jù);有多個SQL數(shù)據(jù)庫來管理單獨的應(yīng)用程序,但是一個應(yīng)用程序可能需要直接訪問另一個數(shù)據(jù)庫;管理多個NoSQL和Redis數(shù)據(jù)庫以存儲不同種類的數(shù)據(jù)等。
當(dāng)面對使用多個數(shù)據(jù)庫時,通常,一個充當(dāng)主服務(wù)器,而其他服務(wù)器充當(dāng)從服務(wù)器。因為我是在Rails 6發(fā)布之前進行管理的,所以我使用了一種不太理想的方式(讀取修補程序/ hacky)來完成此任務(wù)。我為第二個數(shù)據(jù)庫創(chuàng)建了一個單獨的YAML文件,用于存儲連接信息。這是一個示例文件:
second_database.yaml
adapter: db_adapter
encoding: db_encoding
pool: db_pool
username: db_username
password: db_password
database: db_name
host: db_host
要訪問多個數(shù)據(jù)庫,每次:
通過從YAML文件中讀取連接信息來建立連接
config = YAML.load_file(second_database.yaml')
connection = ActiveRecord::Base.establish_connection(
adapter: config['adapter'],
host: config['host'],
database: config['database'],
username: config['username'],
password: config['password']
)
查詢數(shù)據(jù)
employees = connection.execute("SELECT * from employees")
關(guān)閉連接
connection.close
但是,發(fā)布新的Rails 6時,您可能不必費心(并且可以自己編寫代碼)來管理多個數(shù)據(jù)庫。
Rails 6啟動后,我就升級了我的應(yīng)用程序,以利用多個數(shù)據(jù)庫支持的好處。讓我們逐步了解升級并為多個數(shù)據(jù)庫進行設(shè)置。
首先,檢查并更新ruby版本至2.5,因為rails 6必須要求ruby 2.5或更高版本。
將您的ruby版本升級到2.5或更高版本:
在ruby更新期間,可能僅由于版本升級而獲得語法錯誤或棄用警告。
請逐步更新紅寶石版本-不要直接跳轉(zhuǎn)到最新的紅寶石版本;這會給您帶來很多問題。
更新到下一個增量版本;解決錯誤和警告;運行并解決測試用例,然后重復(fù)該過程。
將rails升級到5.2系列的最新版本:
由于本文僅涵蓋了從導(dǎo)軌5.2到導(dǎo)軌6的升級準則;請確保您使用的是5.x系列的最新版本。
更新Rails 6版本的gemfile:
現(xiàn)在該更新Gemfile中的rails版本了。在您的gem文件中更改rails gem版本。
在終端中運行bundle update rails命令以更新rails和其他相關(guān)的gem。
在終端中運行rails app:update:
通過運行此命令,您會發(fā)現(xiàn)一些新的配置設(shè)置已添加到您的應(yīng)用程序。我建議您對每個文件更改使用差異工具選項(d)。
取消注釋new_framework_defaults_6_0.rb中的默認值:
運行遷移:
現(xiàn)在,運行bundle install安裝剩余的gem,并運行遷移并解決問題(如果有)。
運行并修復(fù)TestCases:
大規(guī)模升級之后,讓我們測試您的應(yīng)用程序。運行您的測試案例;解決是否有任何失敗,并解決棄用警告。
啟動本地主機并執(zhí)行手動測試:
我建議您對您的應(yīng)用程序進行一輪手動測試。趕緊動手,開始手動測試您的應(yīng)用程序。
現(xiàn)在,讓我們進一步進行使用Rails 6的多個數(shù)據(jù)庫設(shè)置。
有了rails 6多數(shù)據(jù)庫支持,您可以擁有多個數(shù)據(jù)庫,并且每個數(shù)據(jù)庫都有一個副本(只讀副本)。
現(xiàn)在,考慮具有單個主數(shù)據(jù)庫的Rails應(yīng)用程序,現(xiàn)在升級到Rails 6之后,您需要為一些新表添加新數(shù)據(jù)庫。您的database.yml當(dāng)前版本如下:
帶導(dǎo)軌6;您可以為主數(shù)據(jù)庫添加副本,也可以通過更新database.yml來添加新數(shù)據(jù)庫,如下所示:
考慮將副本用于數(shù)據(jù)庫時需要注意的幾點:
.對于主數(shù)據(jù)庫和副本數(shù)據(jù)庫,數(shù)據(jù)庫名稱應(yīng)該相同,因為兩個數(shù)據(jù)庫都包含相同的數(shù)據(jù)。使用副本數(shù)據(jù)庫時,您需要添加一個replica: true 數(shù)據(jù)庫設(shè)置。
.副本數(shù)據(jù)庫和主數(shù)據(jù)庫的用戶名應(yīng)該不同;主用戶將同時具有讀取和寫入權(quán)限,而副本用戶將僅具有讀取權(quán)限別寫。
.添加新數(shù)據(jù)庫時,還需要注意遷移路徑。要實現(xiàn)它,您需要添加migrations_path如上所示,在database.yml文件中進行設(shè)置。盡管我們有一個副本數(shù)據(jù)庫,但我們沒有為其設(shè)置遷移路徑。
完成此步驟后,您將添加一個新數(shù)據(jù)庫。現(xiàn)在,讓我們?yōu)槠浣⒁粋€模型。要使用一個新的數(shù)據(jù)庫,您需要向您的應(yīng)用程序添加一個抽象模型類。如下所示:
現(xiàn)在您可以訪問新數(shù)據(jù)庫了;現(xiàn)在讓我們簡要討論多個數(shù)據(jù)庫功能:
1.主數(shù)據(jù)庫和副本數(shù)據(jù)庫之間的自動連接切換:
要對應(yīng)用程序使用只讀數(shù)據(jù)庫,您需要配置中間件以進行自動連接切換。
自動連接切換使您的應(yīng)用程序可以基于HTTP請求方法在主數(shù)據(jù)庫和副本數(shù)據(jù)庫之間進行切換。
例如,如果您的應(yīng)用程序收到POST,PUT,DELETE或PATCH請求,則該應(yīng)用程序?qū)⒆詣訉懭胫鲾?shù)據(jù)庫。并且,對于諸如GET或HEAD之類的請求,應(yīng)用程序從副本之一讀取。
配置中間件以進行自動連接切換;取消注釋或?qū)⒁韵滦刑砑拥綉?yīng)用程序配置。
僅當(dāng)讀取請求在我們上面配置的范圍內(nèi)時,Rails才將GET或HEAD請求發(fā)送到主請求。默認情況下,它將設(shè)置為2秒。您可以根據(jù)數(shù)據(jù)庫基礎(chǔ)結(jié)構(gòu)自由更改它。
2. 在主數(shù)據(jù)庫和副本數(shù)據(jù)庫之間進行手動連接切換:
手動連接到副本數(shù)據(jù)庫或主數(shù)據(jù)庫;軌道提供ActiveRecord::Base.connected_to 方法。
有時,無論請求類型如何,您的應(yīng)用程序都需要連接到主數(shù)據(jù)庫或副本數(shù)據(jù)庫。在這種情況下,您可以利用connected_to ActiveRecord提供的方法。
通過使用上面的代碼,無論請求類型如何,都可以強制您的應(yīng)用程序連接到博客的數(shù)據(jù)庫。
現(xiàn)在,此命令使用該連接讀取博客數(shù)據(jù)庫的副本并使用它。
Rails 6的多個數(shù)據(jù)庫不支持哪些功能?
.分片
.副本的負載平衡
.跨多個數(shù)據(jù)庫聯(lián)接
我們可以預(yù)期這些功能很快就會出現(xiàn),并可以幫助我們使用Rails 6 super高效地配置,使用和管理多個數(shù)據(jù)庫。
好了,關(guān)于如何在Rails 6中管理多個數(shù)據(jù)庫的信息,介紹到這里就結(jié)束了,想了解更多關(guān)于數(shù)據(jù)庫的信息,請繼續(xù)關(guān)注中培偉業(yè)。