6

我有一个 Rails 应用程序和一个 Sinatra 应用程序,共享同一个数据库。Sinatra 应用程序使用 ActiveRecord。

我可以从每个应用程序中运行迁移,就好像它们在同一个应用程序中一样?这会导致任何问题吗?

Rails 应用程序中的 schema.rb 文件通过以下方式跟踪当前迁移

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

但是,Sinatra 应用程序如何知道数据库的当前版本?

导轨 3.2.2,红宝石 1.9.3。

4

5 回答 5

4

schema_migrations 表中的版本列等同于 ruby​​ 迁移文件示例前面的时间戳:20130322151805_create_customers.rb 因此,如果两个或更多应用程序对 schema_migrations 表有贡献,并且 rails 找不到down() 方法(因为它不会找到另一个应用程序中包含的迁移文件,即 db/migrate/...)

我目前的情况就是这样,我选择了一个主 ActiveRecord 应用程序,它可以随着我们的数据库的发展来管理迁移和数据转换。请记住,交易的一部分是让模型保持最新。这非常耗时,因此我们正在考虑将数据库拆分为业务域并提供 API (JSON) 来查询另一个应用程序的支持数据。这样每个应用程序都管理它的域并负责通过 API 公开数据。

问候。

于 2013-03-22T16:54:02.890 回答
3

如果您将两个应用程序连接到同一个数据库,您应该能够在其上运行迁移,但我强烈建议您使用另一种选项,因为您几乎肯定会在某个时候碰壁:

  • 如果可能,将数据库一分为二,每个应用程序负责自己的数据库/迁移。

  • 将一个应用程序视为“主”数据库,并将另一个数据库用于特定于第二个应用程序的数据,但使其连接到两个数据库(每个应用程序仍然只将迁移应用到一个数据库)

如果您需要在多个应用程序之间共享数据,另一种选择是在一个应用程序中实现一个 REST 服务并在另一个应用程序上使用它,您可以查看葡萄 gem 以获得一种简单的方法。

编辑:我意识到我忘了谈论 activerecord 迁移,不再有任何“版本”模式,activerecord 所做的是它读取所有迁移文件名,提取它们的标识符(起始部分)并检查它们是否有已经应用了,所以理论上你可以从同一个数据库上的两个应用程序运行迁移,只要它们不干扰。但是如果两个迁移都作用于同一张表,你几乎肯定会在某一时刻遇到大麻烦。

于 2012-11-27T16:37:08.053 回答
1

Rails 迁移将当前数据库版本存储在数据库的schema_migrations表中。因此,您的两个应用程序都将能够检查当前版本。

版本号是时间戳,所以重复值不应该有任何问题,因为几乎不可能在完全相同的毫秒内生成两个迁移。所以你在这里应该没问题。

我看到的唯一问题是,当您在一个应用程序中回滚迁移时,它会将数据库设置为以前的已知版本,我不确定它是否会从数据库中选择前一个(可能来自另一个app),或上一个迁移文件中的编号。您可能需要测试该场景以确保。

于 2012-11-28T09:51:44.463 回答
1

我不同意 Schmurfy,即使他提出的选项是有效的,通过 REST 共享数据也有点矫枉过正(当然,用 ruby​​ / rails 很容易实现)。

如果您的情况很简单,您可以只使用两个应用程序中的一个数据库,并且由于您在这两个应用程序中都使用 AR,所以版本控制没有问题,AR 可以解决这个问题。

我也不知道如果你同时运行 db:migrate 从两个应用程序中会发生什么,如果你使用像 mysql 这样的劣质 dbms,它不允许在事务中进行 DDL,当然没什么好..

此外,查看哪个应用程序需要哪个列并且没有将迁移放在一个地方也会让我感到困扰。您可以使用共享存储库来管理两个应用程序的迁移。

于 2012-11-27T16:48:12.630 回答
0

我决定将所有迁移都放在 Rails 应用程序中,因为:

  1. 由于只有一个数据库
  2. Rails 管理迁移

这运作良好。

这简化了系统,因为所有迁移都存储在一个地方。而且,无论如何,Sinatra 应用程序都不需要知道它们。

于 2012-12-09T15:34:51.460 回答