2012-04-18 21 views
0

假設我有不同的數據庫連接...Rails 3 - 使用多個數據庫連接工作的rake任務

現在就本示例而言,我們只關心開發。當我運行'rake db:setup'時,它只會創建開發,因爲從rake任務的角度來看,其他連接是另一個環境。我可以通過RAILS_ENV傳遞另一個連接來創建數據庫。然而,問題出現在我們如何定義我們的數據庫連接。我寧願不撤消這一點,因爲它使管理和部署更容易。我們所做的是...

在我們的database.yml中,我們添加了以下代碼。

databases_file = File.join(Rails.root.to_s, "config", "databases", "#{Rails.env.to_s}.yml") 
IO.read(databases_file) if File.exist?(databases_file) 

然後在config下的數據庫子文件夾中,我們創建了不同的環境yml文件。

所以development.yml我們有...

development: 
    ... details ... 

logging: 
    ... details ... 

現在,如果我設置RAILS_ENV來「記錄」它永遠不會加載,因爲文件被稱爲development.yml文件。因此它永遠不會找到日誌連接。

如果我將所有這些設置合併到database.yml文件中,那麼我們又回到沒有檢查database.yml到git倉庫中,並且不得不在開發機器上爲新僱員等手動創建它。我們還必須更改我們的部署過程,以開始將文件放置在較低的環境中。 (我們的生產流程已經支持這個)

回答

0

我們有多個數據庫和我們用樹枝嚴重,所以,我想出了這個解決方案來創建多個數據庫和配合他們的名字正在處理的分支...

# config/database.yml 
<%= 
    databases_file = File.join(Rails.root.to_s, "config", "databases", "#{Rails.env.to_s}.yml") 
    if Rails.env.development? || Rails.env.test? 
    branch = ENV['BRANCH'] || `git branch --no-color 2> /dev/null`.chomp.split("\n").grep(/^[*]/).first[/(\S+)$/,1].sub("-", "_") 
    puts "Using databases for #{branch}" 
    IO.read(databases_file).gsub!("<branch>", branch) if File.exist?(databases_file) 
    else 
    IO.read(databases_file) if File.exist?(databases_file) 
    end 
%> 

然後你爲每個環境創建一個數據庫文件。在development.yml和test.yml中,您使用令牌讓該腳本查找需要做什麼以進行替換。所以一個示例文件看起來像這樣。

# config/databases/development.yml 
development: 
    adapter: mysql2 
    host: 127.0.0.1 
    database: <branch>_dev 
    username: user 
    password: pass 

versions: 
    adapter: mysql2 
    host: 127.0.0.1 
    database: <branch>_versions 
    username: user 
    password: pass 

reporting: 
    adapter: mysql2 
    host: 127.0.0.1 
    database: <branch>_reporting 
    username: user 
    password: pass 

ods: 
    adapter: mysql2 
    host: 127.0.0.1 
    database: <branch>_ods 
    username: user 
    password: pass 

我再延伸耙任務來處理多個數據庫

這是大部分的工作去了,所以我要離開它的答案,讓你爲它工作!實際上,這只是一大堆我不引以爲豪的事情,並且很樂意花時間修復它,但還沒有找到。我不想讓任何人走錯路,但如果您有任何問題,請給我一個信息,我會很樂意提供幫助。

0

您可以使用環境變量來管理這些。你可以有定義的,如東西單一的database.yml:

development: 
    database: ENV['DEVELOPMENT_DATABASE'] 

,然後在.bashrc/.zshrc設置環境變量。

+0

正如我所說我不想將我的文件合併到一個database.yml中。我最終編寫了所有新的rake任務。如果我能找出一種方法讓它們脫穎而出,我可能會在某些時候在github上發佈它們。 – Altonymous 2012-04-19 03:52:37