使用pg_dump从一个模式导出并导入到另一个模式

时间:2014-07-23 21:44:50

标签: sql postgresql

我有一个名为units的表,它存在于同一数据库中的两个单独的模式中(我们称之为old_schemanew_schema)。两个模式中的表的结构是相同的。唯一的区别是units中的new_schema表目前是空的。

我正在尝试从old_schema中的此表中导出数据并将其导入new_schema。我使用pg_dump来处理导出,如下所示:

pg_dump -U username -p 5432 my_database -t old_schema.units -a > units.sql

然后我尝试使用以下内容导入它:

psql -U username -p 5432 my_database -f units.sql

不幸的是,这似乎尝试重新插入old_schema。看看生成的sql文件,似乎有一行,我认为这导致了这个:

SET search_path = mysql_migration, pg_catalog;
事实上,我可以改变这一行来阅读

SET search_path = public;

这确实证明是成功的,但我不相信这是"正确的"实现这一目标的方法。

问题:通过pg_dump生成的脚本导入数据时,如何在不更改生成的文件的情况下指定数据的格式?

1 个答案:

答案 0 :(得分:3)

根据您描述的情况,这里有两个主要问题。

  1. 您提到的架构中的差异
  2. 通过 pg_dump 转储整个表的事实,您也正在转储表定义,如果表已存在于目标模式中,这将导致问题。
  3. 要仅转储数据,如果目标数据库中已存在该表(基于上述情况,这似乎是这种情况),则可以使用 pg_dump 转储表{{ 1}}标志。

    然后,为了解决架构问题,我建议在输出 sql 文件上执行搜索/替换( sed 将是一种快速的方法),将--data-only替换为old_schema

    这样,它会将数据(这是文件中的所有数据,而不是表定义本身)应用于new_schema中的表。

    如果您需要更广泛的解决方案来支持(例如)动态命名的架构,您可以使用与 sed 相同的搜索/替换技巧,而不是将其替换为{{1}用一些占位符文本替换它,比如说new_schema(在文件的其他地方不太可能出现令牌),然后,当你需要将该文件应用于特定模式时,使用原始文件作为模板,复制它,然后使用 sed 或类似方法修改副本,将占位符令牌替换为所需的动态模式名​​称。

    您可以在命令行上为 psql 设置一些选项,例如new_schema,但是,$$placeholder_schema$$的类似方法似乎没有任何效果。< / p>

    相反,它需要--set AUTOCOMMIT=off形式,可以使用SEARCH_PATH选项指定,但不能与\set SEARCH_PATH to <path>一起指定(它是或者)。

    考虑到这一点,我认为使用 sed 修改文件可能是最好的选择,在这种情况下用于-c

相关问题