Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当多个应用程序在Ruby中共享同一数据库时,如何管理迁移?_Ruby On Rails_Ruby_Activerecord_Sinatra_Database Migration - Fatal编程技术网

Ruby on rails 当多个应用程序在Ruby中共享同一数据库时,如何管理迁移?

Ruby on rails 当多个应用程序在Ruby中共享同一数据库时,如何管理迁移?,ruby-on-rails,ruby,activerecord,sinatra,database-migration,Ruby On Rails,Ruby,Activerecord,Sinatra,Database Migration,我有一个Rails应用程序和一个Sinatra应用程序,共享同一个数据库。Sinatra应用程序使用ActiveRecord 我是否可以从每个应用程序中运行迁移,就像它们在同一个应用程序中一样?这会引起什么问题吗 Rails应用程序中的schema.rb文件通过 ActiveRecord::Schema.define(:version => 20121108154656) do 但是,Sinatra应用程序如何知道数据库的当前版本 Rails 3.2.2、Ruby 1.9.3。如果您将两

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

我是否可以从每个应用程序中运行迁移,就像它们在同一个应用程序中一样?这会引起什么问题吗

Rails应用程序中的schema.rb文件通过

ActiveRecord::Schema.define(:version => 20121108154656) do
但是,Sinatra应用程序如何知道数据库的当前版本


Rails 3.2.2、Ruby 1.9.3。

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

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

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

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

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

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

如果您的情况很简单,那么您可以使用两个应用程序中的一个数据库,因为您在这两个应用程序中都使用了AR,所以在版本控制方面没有问题,AR会解决这个问题

另外,我不知道如果同时运行db:migrate从两个应用程序中迁移会发生什么,如果您使用像mysql这样的劣等dbms,它不允许事务中使用DDL,那么肯定没有什么好处


另外,如果我想知道哪个应用程序需要哪个列,而不是在一个地方进行迁移,我会感到很烦恼。您可以使用共享存储库来管理两个应用程序的迁移。

Rails迁移将当前数据库版本存储在数据库的
schema\u migrations
表中。因此,您的两个应用程序都可以检查当前版本

版本号是时间戳,因此重复值应该不会有任何问题,因为几乎不可能在同一毫秒内生成两次迁移。所以你在这里应该很好


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

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

  • 因为只有一个数据库
  • Rails管理迁移
  • 这很有效


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

    模式迁移表中的version列相当于ruby迁移文件前面的时间戳示例:20130322151805\u create\u customers.rb,因此如果两个或更多的应用程序对模式迁移表做出贡献,那么如果rails不能,则无法回滚模式迁移表查找down()方法(因为它找不到另一个应用程序ie db/migrate/…中包含的迁移文件)

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


    问候

    我认为这两种解决方案都不可行,因为它们都需要共享相同的数据,而且我认为运行一个数据库更简单……但也许我可以将所有迁移放在Rails应用程序中……我添加了一个关于activerecord迁移如何工作的解释,两个应用程序的独立性如何?如果您可以同时分发/安装/部署它们,那么您可以确定其中一个负责迁移,甚至可以将它们放在同一个git/svn/…我只想指出一个不太明显的陷阱。我的答案有什么问题?您选择了我提到的第二个选项之一…只有一个数据库。