我有一个名为units
的表,它存在于同一数据库中的两个单独的模式中(我们称之为old_schema
和new_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生成的脚本导入数据时,如何在不更改生成的文件的情况下指定数据的格式?
答案 0 :(得分: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
。