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';`
我通常这样做对于导入特定的列转储
创建 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
更改文件权限。作为只读
当我执行此命令时:
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';`
我通常这样做对于导入特定的列转储
创建 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
更改文件权限。作为只读