6

同じデータベースを共有しているRailsアプリとSinatraアプリがあります。SinatraアプリはActiveRecordを使用します。

同じアプリ内にあるかのように、各アプリ内から移行を実行できますか?これは問題を引き起こしますか?

Railsアプリのschema.rbファイルは、を介して現在の移行を追跡します

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

しかし、Sinatraアプリはどのようにしてデータベースの現在のバージョンを認識しますか?

Rails 3.2.2、Ruby1.9.3。

4

5 に答える 5

4

schema_migrationsテーブルのバージョン列は、ruby移行ファイルの例の前にあるタイムスタンプと同じです。20130322151805_create_customers.rbしたがって、2つ以上のアプリケーションがschema_migrationsテーブルに貢献している場合、レールが見つからない場合、ロールバックはできません。 down()メソッド(別のアプリ、つまりdb / migrate / ...に含まれている移行ファイルが見つからないため)

私はまさにこれである現在の状況を持っており、データベースの進化に合わせて移行とデータ変換を管理するマスターActiveRecordアプリを選択しました。取引の一部は、モデルも最新の状態に保つことであることに注意してください。これには時間がかかるため、DBをビジネスドメインに分割し、別のアプリケーションのサポートデータをクエリするためのAPI(JSON)を提供することを検討しています。このようにして、各アプリケーションはドメインを管理し、APIを介してデータを公開する責任があります。

よろしく。

于 2013-03-22T16:54:02.890 に答える
3

両方のアプリケーションを同じデータベースに接続すると、そのデータベースで移行を実行できるはずですが、ほぼ確実に壁にぶつかることになるため、別のオプションを使用することを強くお勧めします。

  • 可能であればデータベースを2つに分割し、各アプリケーションが独自のデータベース/移行を担当します。

  • 1つのアプリケーションを「マスター」データベースと見なし、2番目のアプリケーションに固有のデータに別のデータベースを使用しますが、両方のデータベースに接続します(各アプリケーションは引き続き1つのデータベースにのみ移行を適用します)

複数のアプリケーション間でデータを共有する必要がある場合、もう1つのオプションは、一方にRESTサービスを実装し、もう一方にそれを使用することです。これを行う簡単な方法については、ブドウの宝石をご覧ください。

編集:activerecordの移行について話すのを忘れたのですが、スキーマの「バージョン」はもうありません。activerecordが行うことは、すべての移行ファイル名を読み取り、識別子(開始部分)を抽出して、すでに適用されているため、理論的には、干渉しない限り、同じデータベース上の2つのアプリケーションからの移行を実行できます。ただし、両方の移行が同じテーブルで機能する場合、ほぼ確実に、ある時点で大きな問題が発生します。

于 2012-11-27T16:37:08.053 に答える
1

Railsの移行では、現在のデータベースバージョンがschema_migrationsデータベースのテーブルに保存されます。そのため、両方のアプリで現在のバージョンを確認できます。

バージョン番号はタイムスタンプであるため、まったく同じミリ秒で2つの移行を生成することはほとんど不可能であるため、値が重複しても問題はありません。だからここで大丈夫なはずです。

私が見る唯一の問題は、1つのアプリで移行をロールバックすると、dbが以前の既知のバージョンに設定され、dbから前のバージョン(他のアプリからのものである可能性があります)を選択するかどうかわからないことです。 app)、または前の移行ファイルの番号。そのシナリオをテストして確認することをお勧めします。

于 2012-11-28T09:51:44.463 に答える
1

Schmurfyに同意しません。提示されたオプションが有効であっても、RESTを介してデータを共有するのは少しやり過ぎです(もちろん、ruby / railsで実装するのは非常に簡単です)。

ケースが単純な場合は、両方のアプリから1つのデータベースを使用するだけで済み、両方のアプリでARを使用するため、バージョン管理に問題はありません。ARがそれを処理します。

また、トランザクションでDDLを許可しないmysqlのような劣ったdbmsを使用した場合、両方のアプリからdb:migrateを同時に実行するとどうなるかわかりませんが、確かに何も良いことではありません。

また、どのアプリがどの列を必要とし、1か所に移行がないかを確認するのも面倒です。共有リポジトリを使用して、両方のアプリからの移行を管理できます。

于 2012-11-27T16:48:12.630 に答える
0

Railsアプリにすべての移行を配置することにしました。理由は次のとおりです。

  1. データベースが1つしかないので
  2. Railsは移行を管理します

これはうまくいきました。

これにより、すべての移行が1つの場所に保存されるため、システムが簡素化されます。そして、Sinatraアプリはとにかくそれらについて知る必要はありません。

于 2012-12-09T15:34:51.460 に答える