table - Exportar linhas específicas de uma tabela do PostgreSQL como script SQL INSERT




postgresql csv export copy (6)

Eu tenho um esquema de banco de dados chamado: nyummy e uma tabela chamada 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)
);

Eu quero exportar dados da tabela do cimory como inserir arquivo de script SQL. No entanto, eu só quero exportar registros / dados onde a cidade é igual a 'tokyo' (suponha que os dados da cidade sejam todos minúsculos).

Como fazer isso?

Não importa se a solução está nas ferramentas GUI de freeware ou na linha de comando (embora a solução das ferramentas GUI seja melhor). Eu tentei o pgAdmin III, mas não consigo encontrar uma opção para fazer isso.


Crie uma tabela com o conjunto que você deseja exportar e, em seguida, use o utilitário de linha de comando pg_dump para exportar para um arquivo:

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 serão despejados como comandos de inserção com nomes de colunas.

--data-only não despeja o esquema.

Como comentado abaixo, criar uma visualização em vez de uma tabela evitará a criação da tabela sempre que uma nova exportação for necessária.


Esta é uma maneira fácil e rápida de exportar uma tabela para um script com o pgAdmin manualmente sem instalações extras :

  1. Clique com o botão direito na tabela de destino e selecione "Backup".
  2. Selecione um caminho de arquivo para armazenar o backup. Como formato, escolha "simples".
  3. Abra a aba "Dump Options # 2" na parte inferior e marque "Use Column Inserts".
  4. Clique no botão Backup.
  5. Se você abrir o arquivo resultante com um leitor de texto (por exemplo, notepad ++), você receberá um script para criar a tabela inteira. A partir daí, você pode simplesmente copiar as instruções INSERT geradas.

Este método também funciona com a técnica de fazer um export_table como demonstrado na resposta do @Clodoaldo Neto.


Eu tentei escrever um procedimento fazendo isso, baseado nos códigos @PhilHibbs, de uma maneira diferente. Por favor, dê uma olhada e teste.

 CREATE OR REPLACE FUNCTION dump(IN p_schema text, IN p_table text, IN p_where text)
   RETURNS setof text AS
 $BODY$
 DECLARE
     dumpquery_0 text;
     dumpquery_1 text;
     selquery text;
     selvalue text;
     valrec record;
     colrec record;
 BEGIN

     -- ------ --
     -- GLOBAL --
     --   build base INSERT
     --   build SELECT array[ ... ]
     dumpquery_0 := 'INSERT INTO ' ||  quote_ident(p_schema) || '.' || quote_ident(p_table) || '(';
     selquery    := 'SELECT array[';

     <<label0>>
     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
         dumpquery_0 := dumpquery_0 || quote_ident(colrec.column_name) || ',';
         selquery    := selquery    || 'CAST(' || quote_ident(colrec.column_name) || ' AS TEXT),';
     END LOOP label0;

     dumpquery_0 := substring(dumpquery_0 ,1,length(dumpquery_0)-1) || ')';
     dumpquery_0 := dumpquery_0 || ' VALUES (';
     selquery    := substring(selquery    ,1,length(selquery)-1)    || '] AS MYARRAY';
     selquery    := selquery    || ' FROM ' ||quote_ident(p_schema)||'.'||quote_ident(p_table);
     selquery    := selquery    || ' WHERE '||p_where;
     -- GLOBAL --
     -- ------ --

     -- ----------- --
     -- SELECT LOOP --
     --   execute SELECT built and loop on each row
     <<label1>>
     FOR valrec IN  EXECUTE  selquery
     LOOP
         dumpquery_1 := '';
         IF not found THEN
             EXIT ;
         END IF;

         -- ----------- --
         -- LOOP ARRAY (EACH FIELDS) --
         <<label2>>
         FOREACH selvalue in ARRAY valrec.MYARRAY
         LOOP
             IF selvalue IS NULL
             THEN selvalue := 'NULL';
             ELSE selvalue := quote_literal(selvalue);
             END IF;
             dumpquery_1 := dumpquery_1 || selvalue || ',';
         END LOOP label2;
         dumpquery_1 := substring(dumpquery_1 ,1,length(dumpquery_1)-1) || ');';
         -- LOOP ARRAY (EACH FIELD) --
         -- ----------- --

         -- debug: RETURN NEXT dumpquery_0 || dumpquery_1 || ' --' || selquery;
         -- debug: RETURN NEXT selquery;
         RETURN NEXT dumpquery_0 || dumpquery_1;

     END LOOP label1 ;
     -- SELECT LOOP --
     -- ----------- --

 RETURN ;
 END
 $BODY$
   LANGUAGE plpgsql VOLATILE;

E depois :

-- for a range
SELECT dump('public', 'my_table','my_id between 123456 and 123459'); 
-- for the entire table
SELECT dump('public', 'my_table','true');

testado no meu postgres 9.1, com uma tabela com tipo de dados de campo misto (texto, duplo, int, timestamp sem fuso horário, etc).

É por isso que o tipo CAST no tipo TEXT é necessário. Meu teste é executado corretamente por cerca de 9 milhões de linhas, parece que ele falha pouco antes de 18 minutos de execução.

ps: Eu encontrei um equivalente para o mysql na WEB.


Para o meu caso de uso, eu era capaz de simplesmente canalizar para o grep.

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

Você pode visualizar a tabela com registros specifit e, em seguida, fazer o dump do arquivo sql

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

você tentou no pgadmin executando a consulta com a opção " EXECUTE QUERY WRITE RESULT TO FILE "

é só exportar os dados, senão tentar

pg_dump -t view_name DB_name > db.sql

-t opção usada para ==> dump apenas tabelas (ou visualizações ou sequências) tabela de correspondência, refer





postgresql-copy