从PostgreSQL表中导出特定的行作为INSERT SQL脚本

我有一个名为: 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脚本文件。 但是,我只想输出城市等于'东京'的logging/数据(假设城市数据全部是小写)。

怎么做?

这个解决scheme是否在免费的GUI工具或命令行中(尽pipeGUI工具解决scheme更好)并不重要。 我曾尝试pgAdmin三,但我找不到一个选项来做到这一点。

使用要导出的集合创build表,然后使用命令行实用程序pg_dump导出到文件:

 create table export_table as select id, name, city from nyummy.cimory where city = 'tokio' 
 $ pg_dump --table=export_table --data-only --column-inserts my_database > data.sql 

--column-inserts将作为插入命令转储列名。

--data-only不转储架构。

如下所述,创build一个视图而不是一个表会避免创build表时创build一个新的导出是必要的。

对于仅数据导出使用COPY
你得到一个每行一行表格的文件(不是INSERT命令),它更小更快:

 COPY (SELECT * FROM nyummy.cimory WHERE city = 'tokio') TO '/path/to/file.csv'; 

通过以下方式将其导入到具有相同结构的另一个表中:

 COPY other_tbl FROM '/path/to/file.csv'; 

与客户端程序(如pg_dumppsqlCOPY 会向服务器本地写入和读取文件。 如果两者都在同一台计算机上运行,​​那么这并不重要,但它可以用于远程连接。

还有psql的\copy命令 :

执行前端(客户端)副本。 这是一个运行SQL COPY命令的操作,而不是读取或写入指定文件的服务器,psql读取或写入文件并在服务器和本地文件系统之间路由数据。 这意味着文件的可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要SQL超级用户权限。

SQL Workbench具有这样的function。

运行查询后,右键单击查询结果,select“复制数据为SQL> SQL插入”

这是一种使用pgAdmin手动将表格导出到脚本简便方法, 无需额外安装

  1. 右键单击目标表并select“备份”。
  2. select一个文件path来存储备份。 作为格式select“平原”。
  3. 打开底部的“转储选项#2”选项卡并选中“使用列插入”。
  4. 点击备份button。
  5. 如果你用文本阅读器(例如记事本++)打开生成的文件,你会得到一个脚本来创build整个表格。 从那里你可以简单地复制生成的INSERT语句。

这个方法也可以在@Clodoaldo Neto的答案中演示出一个export_table。

在目标表上点击右键并选择“备份”

选择目标路径并将格式更改为“普通”

打开底部的“转储选项#2”选项卡并选中“使用列插入”

您可以从那里复制INSERT语句。

对于我的使用情况,我能够简单地pipe道grep。

 pg_dump -U user_name --data-only --column-inserts -t nyummy.cimory | grep "tokyo" > tokyo.sql 

您可以使用指定logging查看表,然后转储sql文件

 CREATE VIEW foo AS SELECT id,name,city FROM nyummy.cimory WHERE city = 'tokyo' 

我只是敲了一个快速的程序来做到这一点。 它只适用于单行,所以我创build了一个临时视图,只select我想要的行,然后用我想要插入的实际表replacepg_temp.temp_view。

 CREATE OR REPLACE FUNCTION dv_util.gen_insert_statement(IN p_schema text, IN p_table text) RETURNS text AS $BODY$ DECLARE selquery text; valquery text; selvalue text; colvalue text; colrec record; BEGIN selquery := 'INSERT INTO ' || quote_ident(p_schema) || '.' || quote_ident(p_table); selquery := selquery || '('; valquery := ' VALUES ('; FOR colrec IN SELECT table_schema, table_name, column_name, data_type FROM information_schema.columns WHERE table_name = p_table and table_schema = p_schema ORDER BY ordinal_position LOOP selquery := selquery || quote_ident(colrec.column_name) || ','; selvalue := 'SELECT CASE WHEN ' || quote_ident(colrec.column_name) || ' IS NULL' || ' THEN ''NULL''' || ' ELSE '''' || quote_literal('|| quote_ident(colrec.column_name) || ')::text || ''''' || ' END' || ' FROM '||quote_ident(p_schema)||'.'||quote_ident(p_table); EXECUTE selvalue INTO colvalue; valquery := valquery || colvalue || ','; END LOOP; -- Replace the last , with a ) selquery := substring(selquery,1,length(selquery)-1) || ')'; valquery := substring(valquery,1,length(valquery)-1) || ')'; selquery := selquery || valquery; RETURN selquery; END $BODY$ LANGUAGE plpgsql VOLATILE; 

如此调用:

 SELECT distinct dv_util.gen_insert_statement('pg_temp_' || sess_id::text,'my_data') from pg_stat_activity where procpid = pg_backend_pid() 

我还没有testing过注射攻击,请告诉我,如果quote_literal调用是不够的。

此外,它只适用于可以简单地投射到::文本和返回的列。

这也是Greenplum,但我想不出为什么它不会在Postgres,CMIIW上工作的原因。

你有没有在pgadmin尝试执行查询与" EXECUTE QUERY WRITE RESULT TO FILE "选项

其唯一的输出数据,其他的尝试像

 pg_dump -t view_name DB_name > db.sql 

-t选项用于==>仅转储表(或视图或序列)匹配表, 请参阅