postgresql将特定列从特定表从一个数据库导出到另一个数据库的最佳方法是什么

postgresql将特定列从特定表从一个数据库导出到另一个数据库的最佳方法是什么,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,执行此命令时: SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'; 我看到了要从开发服务器上的DB复制到生产服务器上的页面 因此,我的目标是转储这些特定页面,然后将它们插入到生产数据库中 我的问题是: 可能吗?这是最好的做法/方式吗 非常感谢您在我的请求上花费了这么多时间。我按以下方式完成: 1.创建转储: psql -h dbhost1 -d dbname -U dbuser -c

执行此命令时:

SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog';
我看到了要从开发服务器上的DB复制到生产服务器上的页面

因此,我的目标是转储这些特定页面,然后将它们插入到生产数据库中

我的问题是: 可能吗?这是最好的做法/方式吗


非常感谢您在我的请求上花费了这么多时间。

我按以下方式完成:

1.创建转储:

psql -h dbhost1 -d dbname -U dbuser -c "copy(SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog') to stdout" > dump.tsv`
psql -h dbhost2 -d dbname -U dbuser -c 'copy cms_title from stdin' < dump.tsv
`SELECT
    'INSERT INTO cms_title(language, title) VALUES '
        || string_agg( '(' || language || ', '|| title || ')',  ',' )
        || ';'
FROM cms_title WHERE language != 'en' AND title != 'Blog';`
2.导入转储:

psql -h dbhost1 -d dbname -U dbuser -c "copy(SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog') to stdout" > dump.tsv`
psql -h dbhost2 -d dbname -U dbuser -c 'copy cms_title from stdin' < dump.tsv
`SELECT
    'INSERT INTO cms_title(language, title) VALUES '
        || string_agg( '(' || language || ', '|| title || ')',  ',' )
        || ';'
FROM cms_title WHERE language != 'en' AND title != 'Blog';`
psql-h dbhost2-d dbname-U dbuser-c'copy cms_title from stdin'

这将把导入的数据附加到表中。

我可以看到4种方法:

1。将该列导出为
.csv
,并在Second DB上从中导入

COPY (
    SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'
) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER ';';
将该
.csv
放在该服务器上目标服务器可访问的路径中执行导入:

COPY cms_title FROM '/path/to/csv/cms_title_dump.csv' DELIMITER ';' CSV;
或\复制以在psql+db中使用命令

2。使用
pg_dump
将其转储,并在second DB上还原(
pg_restore

COPY (
    SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog'
) TO '/path/to/csv/cms_title_dump.csv' WITH CSV HEADER DELIMITER ';';
转储:

恢复:

pg_restore -h dest_db_address -U dest_db_user -p dest_dp_port -d db_name /path/to/dump/cms_title.dump;
在这种情况下,您必须记住,
pg_dump
执行整个表数据的转储。不能从表中选择要转储的行子集。因此,在从ona DB向另一个DB进行表镜像时,此选项是合适的

3。使用PostgreSQL的
dblink
模块执行coss数据库查询

4。生成
INSERT
查询并在Second服务器上执行:

psql -h dbhost1 -d dbname -U dbuser -c "copy(SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog') to stdout" > dump.tsv`
psql -h dbhost2 -d dbname -U dbuser -c 'copy cms_title from stdin' < dump.tsv
`SELECT
    'INSERT INTO cms_title(language, title) VALUES '
        || string_agg( '(' || language || ', '|| title || ')',  ',' )
        || ';'
FROM cms_title WHERE language != 'en' AND title != 'Blog';`

对于导入特定的列转储,我通常这样做

  • 创建cms_title_dump.csv文件

    touch /home/www/html/cms_title_dump.csv
    
  • 授予写入权限

    chmoc 777 /home/www/html/cms_title_dump.csv
    
  • 执行此查询

    COPY (SELECT language, title, FROM cms_title WHERE language != 'en' AND title != 'Blog' ) to '/home/www/html/cms_title_dump.csv' DELIMITER ',' CSV HEADER
    
  • 更改文件权限。只读


  • pg_restore会将文件中的内容添加到特定的数据库中吗?听起来很酷,你可以恢复到任何你喜欢的数据库,但是。。。源数据库和目标数据库中的表应该相同(名称和结构)。但是您需要镜像表吗?或者目标数据库上的表已经有一些值了吗?除了blog之外,数据库是相同的。翻译的页面在prod中不存在,所以应该可以。但是请记住,pg_dump执行整个表数据的转储。无法从表中选择要转储的行子集。请从“路径到csv文件”“分隔符”;“复制takson”CSV头文件;太棒了,我要试试!谢谢你,伙计