来自不同数据库的Postgresql传输表数据

时间:2015-11-30 09:08:23

标签: postgresql psql pg-dump

我有两个应用程序,使用相同的表格。其中一个应用程序从Web收集数据。我想将数据发送到我的第二个(网络应用程序)的应用程序数据库。

使用下面的代码,我创建了带有数据的文件:

pg_dump -U username -t public."table_name" -d database name --inserts > table_name.sql

问题是我只想插入第二个数据库中不存在的数据。

如果我尝试下面的代码,我会收到很多已存在的错误:

psql -U username second_database_name < table_name.sql 

错误之一:

multiple primary keys for table "table_name" are not allowed

另一个:

relation "table_name_attribute_442....c74_uniq" already exists

--clean--if-exists ......我该怎么办?

1 个答案:

答案 0 :(得分:0)

我这样做的方法是做一个pg_dump,创建一个适合与pg_restore一起使用的压缩存档,它具有所需的标志,允许导入数据而不会抛出错误。

例如:

pg_dump -Fc -h 127.0.0.1 {db_name_here} > {dump_file_name_here}

“-Fc”为您提供pg_restore想要的文件类型;它会拒绝没有这些魔法字母的转储。

现在您可以使用以下命令恢复文件:

pg_restore -O -h 127.0.0.1 --clean --disable-triggers -d {target_db_name} {dump_file_name_here}

Voila - 数据现在位于target_db中。

如果'psql'命令具有等效的标志,我不知道它们是什么,并且在SO搜索中没有找到它们。但是,希望这能为那些需要重新使用数据库的人提供一个“正常工作”的数据库转储/恢复,而不是试图通过预期的行为来实现简单的转储/恢复。

另请注意,如果您未指定...

-h 127.0.0.1

...它将寻找一个unix-socket,它可能正确配置也可能没有配置。有可能,你的DB用例通过这种方式寻址db,所以你从来没有手动配置unix-socket来匹配命令默认尝试查找的内容,这与setup设置默认套接字的方式不同(当然因为事情“只是工作”,所以你可以“只使用它”是不可能的。)