我有两个应用程序,使用相同的表格。其中一个应用程序从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
......我该怎么办?
答案 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设置默认套接字的方式不同(当然因为事情“只是工作”,所以你可以“只使用它”是不可能的。)