时间:2010-07-23 17:53:47

标签: ruby database merge heroku

4 个答案:

答案 0 :(得分:2)

没有自动的方法来执行此操作,因为无法以通用方式自动执行此操作(无需执行某些您想要执行的操作)。因此,它需要几个步骤,但您可以一直使用工具。

您可以使用Heroku的内置工具来获取表的转储。首先将数据下载并导入数据库,然后将其转储为文本文件(SQL格式)。

在SQL中将其中一个数据集作为文本后,您需要稍微编辑该文件。您需要将其设置为导入脚本,而不是通过删除现有行(或表)开始的“重建数据库”脚本。如果你小心,它可能已经是正确的格式,但可能会有一些关闭。

你可以遇到一些陷阱:

  • 如果您已经为记录生成了密钥 - 您可能会这样做 - 那么您必须在要导入的数据集中对它们重新编号。可能有一种方法可以在没有生成密钥的情况下导出它们,但我所做的是使用快速grep在我合并的数据库范围之外重新编号它们。
  • 如果在其他表中引用了这些键(作为外键),则还必须在那里重新编号。
  • 有些表可能是“参考表”,两个系统都相同,因此您可以跳过导入它们。
  • 某些表可能不需要合并。

一旦文本文件处于良好状态,请在本地运行并测试它。如果它搞砸了,请不要担心 - 只需下载生产数据(您要导入的数据),然后再试一次。迭代,直到你在当地运作良好。然后,将文件上传到heroku。

我知道这听起来像是几步 - 而且确实如此。但是,没有棘手的问题需要解决。你只需要慢慢地小心行事。让某人与你配对,以帮助你思考。

答案 1 :(得分:2)

假设您不需要消除重复项,您可以为每个表

执行此操作
insert into db1.tablea
select * from db2.tablea ;

一些并发症:

  • 如果表格有id列,则需要确保它们不会发生冲突,方法是用新ID替换旧ID
  • 但是,由于id是链接表的键,因此需要确保每个表中的新ID都匹配。

这是一种快速而肮脏的方法:

  • 在第一个数据库的任何表中找到最高ID。
  • 调用此max_key_db1。
  • 然后将第二个数据库中的所有键更新为current_value plus max_key_db1。

请注意,您需要更新主键和外键才能使其正常工作,例如:

update db2.tablea set id = id + max_key_db1, foreign_id = foreign_id + max_key_db1;
update db2.tableb set id = id + max_key_db1, a_id = a_id + max_key_db1;
etc.

现在,您拥有一个自我一致的db2,其中所有键(主键和外键)的值都在db1中不存在;换句话说,您的密钥在两个数据库中都是唯一的

现在您可以将db2中的行插入db1:

insert into db1.tablea
select * from db2.tablea ;

注意,如果插入的表使用自动增量或触发器创建自己的ID,将不会工作;在这种情况下,您必须明确指定ciolumns并关闭所有自动生成的ID:

insert into db1.tablea( id, foreign_id, col1, ...)
select id, foreign_id, col1 from db2.tablea ;

或者,您可以通过为每个表一步完成所有操作来保持db2不变:

insert into db1.tablea( id, foreign_id, col3, col4)
select id + max_key_db1, foreign_id + max_key_db1, col3, col4 from db2.tablea ;

当然,在事务中执行此操作,并且在您确定已获得每个表并且所有表都正确之前不要执行。并在数据库的副本上执行此操作。

现在,既然您使用了db1中的最高密钥而不管表格,那么您的ID可能不会是连续的,但谁在乎呢?钥匙是钥匙。您需要做的是为每个表重置任何auto_increment或sequence,以便下一个自动生成的密钥高于该表中的最高密钥。你如何做到这一点取决于你正在使用的RDBMS。

答案 2 :(得分:0)

要关闭它 - 决定只是手动选择正确的数据并重新输入它,这样我就可以做一些错误检查 - 这很痛苦,但这种方法似乎没有一个简单的答案。自我注意:将所有生产数据保留在生产与测试驱动中。

答案 3 :(得分:0)

如果您只需要执行一次,则可以使用ms访问轻松完成此操作。

您可以通过在可视化查询设计器中创建一些查询来解决任何冲突。

您可以使用odbc driver for sqllite3连接到sqlite3数据库,并在访问中链接这些表。