Ruby on rails 当多个应用程序在Ruby中共享同一数据库时,如何管理迁移?
我有一个Rails应用程序和一个Sinatra应用程序,共享同一个数据库。Sinatra应用程序使用ActiveRecord 我是否可以从每个应用程序中运行迁移,就像它们在同一个应用程序中一样?这会引起什么问题吗 Rails应用程序中的schema.rb文件通过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。如果您将两
ActiveRecord::Schema.define(:version => 20121108154656) do
但是,Sinatra应用程序如何知道数据库的当前版本
Rails 3.2.2、Ruby 1.9.3。如果您将两个应用程序连接到同一个数据库,您应该能够在该数据库上运行迁移,但我强烈建议您使用另一个选项,因为您几乎肯定会在某个时间碰到墙:
- 如果可能,将数据库一分为二,每个应用程序负责自己的数据库/迁移
- 将一个应用程序视为“主”数据库,并将另一个数据库用于第二个应用程序特定的数据,但使其连接到两个数据库(每个应用程序仍然只将迁移应用到一个数据库)
但是,如果两个迁移都在同一个表上运行,您几乎肯定会在某一点上遇到大麻烦。我不同意Schmurfy的观点,即使他提出的选项是有效的,通过REST共享数据也有点过分(当然,使用ruby/rails很容易实现) 如果您的情况很简单,那么您可以使用两个应用程序中的一个数据库,因为您在这两个应用程序中都使用了AR,所以在版本控制方面没有问题,AR会解决这个问题 另外,我不知道如果同时运行db:migrate从两个应用程序中迁移会发生什么,如果您使用像mysql这样的劣等dbms,它不允许事务中使用DDL,那么肯定没有什么好处
另外,如果我想知道哪个应用程序需要哪个列,而不是在一个地方进行迁移,我会感到很烦恼。您可以使用共享存储库来管理两个应用程序的迁移。Rails迁移将当前数据库版本存储在数据库的
schema\u migrations
表中。因此,您的两个应用程序都可以检查当前版本
版本号是时间戳,因此重复值应该不会有任何问题,因为几乎不可能在同一毫秒内生成两次迁移。所以你在这里应该很好
我看到的唯一问题是,当您在一个应用程序中回滚迁移时,它会将db设置为以前的已知版本,我不确定它是否会从db(可能来自其他应用程序)中选择以前的版本,或者从以前的迁移文件中选择数字。您可能需要测试该场景以确保。我决定将所有迁移都放在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/…我只想指出一个不太明显的陷阱。我的答案有什么问题?您选择了我提到的第二个选项之一…只有一个数据库。