2012-11-27 53 views
6

我有一個Rails應用程序和Sinatra應用程序,共享相同的數據庫。 Sinatra應用程序使用ActiveRecord。如何在多個應用程序在Ruby中共享同一個數據庫時管理遷移?

我可以在每個應用程序中運行遷移,就好像它們在同一個應用程序中一樣嗎?這會導致任何問題嗎?

在Rails應用程序的schema.rb文件跟蹤通過

ActiveRecord::Schema.define(:version => 20121108154656) do 

但當前遷移,如何在末日應用程序知道當前版本的數據庫?

Rails 3.2.2,Ruby 1.9.3。

回答

0

我決定把所有遷移的Rails應用程序,因爲:

  1. 既然有
  2. Rails的管理遷移

這一直行之有效只有一個數據庫。

這簡化了系統,因爲所有的遷移都存儲在一個地方。而且,Sinatra應用程序無論如何都不需要知道它們。

+0

我的回答有什麼問題?您選擇了我提到的第二個選項選項之一... – Schmurfy

+0

只有一個數據庫。 –

3

如果連接這兩個應用程序到同一個數據庫,你應該能夠在其上運行的遷移,但我強烈建議你使用另一種選擇,因爲你幾乎肯定會在某個時候碰了壁:

  • 如果可能,將數據庫拆分爲兩個數據庫,每個應用程序負責其自己的數據庫/遷移。

  • 有一個應用程序被認爲是「主」數據庫和其它數據庫用於特定於第二應用程序的數據,但使其連接到這兩個數據庫(每個應用程序仍然只適用遷移到一個數據庫)

如果您需要在多個應用程序之間共享數據,另一個選擇是在一個應用程序中實現REST服務,然後在另一個應用程序中使用該應用程序,您可以通過簡單的方法查看葡萄珠寶。

編輯:我意識到我忘了談論activerecord遷移,模式不再有任何「版本」,activerecord做的是它讀取所有的遷移文件名,提取它們的標識符(起始部分)和檢查它們是否已經被應用,因此理論上你可以在同一個數據庫上運行兩個應用程序的遷移,只要它們不干擾。 但是,如果兩種遷移都在相同的表上進行,那麼您幾乎肯定會在一個點上遇到大麻煩。

+0

+1用於暗示REST api。 – harald

+0

我不認爲這兩種解決方案都能工作,因爲他們都需要共享相同的數據,而且我認爲運行一個數據庫更簡單......但也許我可以把所有的遷移都放在Rails應用程序中...... –

+0

我添加了關於activerecord遷移如何工作的解釋,這兩個應用程序有多獨立?如果您可以同時分發/安裝/部署它們,那麼您可以決定其中一個負責遷移,甚至可以將它們放在同一個git/svn/...中。 – Schmurfy

1

我不同意Schmurfy,即使他提出的選項是有效的,但它通過REST共享數據的一點點矯枉過正(很容易用ruby/rails實現)。

如果你的情況很簡單,你可以從這兩個應用程序使用一個數據庫,並且由於你在兩個應用程序中使用AR,所以你在版本控制方面沒有問題,AR負責處理這個問題。

而且我不知道,如果你運行的db會發生什麼:從兩個應用程序同時放遷移如果使用劣質的DBMS像MySQL不允許DDL事務中,肯定沒有什麼好..

此外,它會打擾我看看哪個應用程序需要哪個列,而不需要在一個地方進行遷移。您可以使用共享存儲庫來管理這兩個應用程序的遷移。

+0

我不會運行遷移同時... –

+0

我只是想指出一個不是很明顯的陷阱。 – Andreas

1

Rails遷移存儲數據庫中schema_migrations表中的當前數據庫版本。所以你的兩個應用程序都可以檢查當前的版本。

版本號是時間戳,所以重複值不應該有任何問題,因爲幾乎不可能在完全相同的毫秒中生成兩個遷移。所以你應該在這裏很好。

我看到的唯一問題是,當您在一個應用程序中回滾遷移時,它會將數據庫設置爲之前已知的版本,我不確定它是否會從數據庫中選擇前一個(可以來自其他應用程序),或來自先前遷移文件的編號。您可能想要測試該場景以確保。

4

在schema_migrations表中的版本列等同於在Ruby遷移文件的例子前面的時間戳:20130322151805_create_customers.rb因此,如果兩個或多個應用程序正促使schema_migrations表的回滾如果Rails可以將不可能找不到down()方法(因爲它不會找到另一個應用程序中包含的遷移文件,例如db/migrate/...)

我有一個當前的情況,就是這個,我選擇了一個掌握ActiveRecord應用程序,可以在數據庫發展時管理遷移和數據轉換。請記住,交易的一部分是保持模型保持最新狀態。這非常耗時,因此我們正在考慮將數據庫分解爲業務域並提供API(JSON)來查詢另一個應用程序的支持數據。這樣每個應用程序管理它的域,並負責通過API公開數據。

關於。

相關問題