Rails - 将数据迁移到具有不同ID的另一个DB

时间:2016-05-06 15:56:08

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord associations

我有一个场景,我需要将一个用户的数据从我的Rails应用程序转储/转移到另一个具有相同配置和表的数据库。例如,应用程序构建为

  class Company < ActiveRecord::Base
    has_many :depots
    has_many :users
  end

  class Depot < ActiveRecord::Base
    belongs_to :company
    has_many :products
  end

  class User < ActiveRecord::Base
    belongs_to :company
  end

  class Product < ActiveRecord::Base
    belongs_to :depot
  end

我的要求是,如果公司A停止付款,我想将他们的数据转储到另一个数据库(例如databse2)以保持我的实际数据库干净,一旦他们回来并开始付款,我想要这些数据。

第二个要求是,database2中已经有一些数据。所以我需要保留所有记录,我想更改companyA的ID(因为已经有一个具有相同ID的公司),同时保存到database2保持关联完好无损。这样做似乎很愚蠢,但这是我的要求。 我使用 Postgres 作为我的应用程序数据库。  任何帮助???

1 个答案:

答案 0 :(得分:1)

你有几个值得调查的选择:

  1. 以单个JSON文件输出所有内容,该文件对客户端在数据库中拥有的所有内容进行编码,并附带ID字段。
  2. 转储可在目标服务器上导入的一系列CSV文件。
  3. 转储单个.sql文件,只需运行即可正确恢复数据。
  4. 第一种选择是最优雅的,但可能需要最多的工作。它使您能够将数据存档在一个易于解析的整洁,整洁的文件中。

    第二个选项可能没问题,或者可能会非常难看,具体取决于您拥有的各种数据。如果涉及的任何二进制数据可能不起作用,但对于干净的纯文本列和表格数据,它通常相当有效。这里的优点是您可以有选择地加载部分数据,而无需提交解析所有数据。

    第三个选项不容易解析,你需要恢复它以便能够使用它,但它确实使插入真的非常简单。您只需要编写一个归档程序,不需要特定的恢复工具。

    无论采取何种方法,您都需要绝对确定身份证号码永远不会重新发行。不要重置序列生成器以填充空洞,并且当移动数据库时也将它们移植过来并测试它们是否设置正确。你需要的最后一件事是ID冲突。

    如果您真的担心ID冲突,您可能希望切换到非数字ID,例如将UUID用于冲突基本无关的所有内容,尽管这不是没有成本的。