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

postgresql what is the best way to export specific column from specific table from a DB to another

当我执行此命令时:

SELECT language, title FROM cms_title WHERE language != 'en' AND title != 'Blog';

我看到了要从开发服务器上的数据库复制到生产服务器的页面。

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

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

非常感谢您抽出时间来处理我的请求。

我按照以下方式进行:

1.create转储:

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`

2.import转储:

psql -h dbhost2 -d dbname -U dbuser -c 'copy cms_title from stdin' < dump.tsv

这会将导入的数据附加到 table。

我可以看到 4 种方法:

1.将该列导出为 .csv 并在第二个 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;

或 \copy 以使用 psql + db

中的命令

2。使用 pg_dump 转储它并在第二个 DB

上恢复 (pg_restore)

转储:

pg_dump opencare -F c -h db_address -U db_user -p sb_port -t cms_title  -f /path/to/dump/cms_title.dump;

恢复:

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 执行整个 table 数据的转储。您不能选择 table 中的行子集进行转储。所以这个选项在做 table 从一个数据库到另一个数据库的镜像时是合适的。

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

4.生成 INSERT 查询并在第二台服务器上执行它:

`SELECT
    'INSERT INTO cms_title(language, title) VALUES '
        || string_agg( '(' || language || ', '|| title || ')',  ',' )
        || ';'
FROM cms_title WHERE language != 'en' AND title != 'Blog';`

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

  1. 创建 cms_title_dump.csv 文件。

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

    chmoc 777 /home/www/html/cms_title_dump.csv
    
  3. 执行这个查询

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