我有一个名为:nyummy的数据库模式和一个名为cimory的表:
create table nyummy.cimory (
id numeric(10,0) not null,
name character varying(60) not null,
city character varying(50) not null,
CONSTRAINT cimory_pkey PRIMARY KEY (id)
);
我想将cimory表的数据导出为插入SQL脚本文件。但是,我只想导出城市等于“tokyo”的记录/数据(假设城市数据都是小写的)。
怎么做呢?
解决方案是使用免费的GUI工具还是命令行并不重要(尽管GUI工具解决方案更好)。我尝试过pgAdmin III,但我找不到这样做的选项。
用你想要导出的集合创建一个表,然后使用命令行实用程序pg_dump导出到一个文件:
create table export_table as
select id, name, city
from nyummy.cimory
where city = 'tokyo'
$ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql
——column-inserts将转储为带有列名的插入命令。
——data-only不转储模式。
正如下面所评论的,在表中创建视图而不是表将避免在需要新的导出时创建表。
只能使用COPY命令导出数据:
COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv';
您可以导出整个表,只导出选定的列,或者如所示导出查询结果。不需要显式地创建表。
您将获得一个纯文本格式的文件,其中每行有一个表(而不是INSERT命令)。比INSERT命令更小更快。
要将相同的表导入到匹配结构的另一个Postgres表中(列顺序相同,数据类型兼容!):
COPY other_tbl FROM '/path/to/file.csv';
COPY在服务器本地读写文件,不像pg_dump或psql这样的客户端程序在客户端本地读写文件。如果两者都运行在同一台机器上,这并不重要,但对于远程连接来说却很重要。
还有psql的\copy命令:
执行前端(客户端)复制。这是一个运行
SQL COPY命令,但不是服务器读取或
写入指定的文件,PSQL读取或写入文件并进行路由
服务器与本地文件系统之间的数据。这意味着
文件可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要SQL超级用户权限。
语法与上面相同。只需将COPY替换为\ COPY。