Estávamos todos em uma situação em que você precisava gerar um relatório e/ou extrair alguns dados de uma base de dados e apresentá-los na folha de aspreads. Em muitos casos, nossos clientes preferem o Excel a manusear planilhas/relatórios, porque, duh, é o Excel.

Então, como você aborda este problema? Você copia e cola dados? Ou usa uma GUI aRDBMS para gerar o relatório em uma planilha eletrônica? Hoje, vou mostrar que você é pequeno mas conveniente recurso do PostgreSQL -COPY.

Hello COPY#

From the COPYdocumentation: “COPY” move dados entre tabelas PostgreSQL e arquivos de sistema de arquivos padrão. COPY TO copia o conteúdo de uma tabela para um arquivo, enquantoCOPY FROM copia os dados de um arquivo para uma tabela (anexando os dados a qualquer coisa que já esteja na tabela). COPY TO também pode copiar os resultados de uma consulta SELECT”

Então, o que faz COPY:

  1. Pode copiar o conteúdo de um ficheiro (dados) para uma tabela, ou
  2. Pode copiar o conteúdo de uma tabela (ou o resultado de uma consulta SELECT) para um ficheiro.

Se for especificada uma lista de colunas, COPY apenas copiará os dados nas colunas especificadas de ou para o ficheiro. Se houver alguma coluna na tabela que não esteja na lista de colunas, COPY FROM irá inserir os valores padrão das colunas.

COPY com um nome de arquivo instrui o servidor PostgreSQL a ler diretamente de ou escrever em um arquivo. O arquivo deve ser acessível ao servidor e o nome deve ser especificado a partir do ponto de vista do servidor. Quando STDIN ou STDOUT é especificado, os dados são transmitidos através da conexão entre o cliente e o servidor.

Sons bons? Vamos tentar!

Disclaimer: COPY tem a capacidade de ler/escrever dados de/para CSV e Binaryfiles. Embora eu tenha certeza de que existem muitos casos de uso de arquivos binários, neste post de blog eu só vou me concentrar em usá-los para arquivos CSV porque, pessoalmente para mim, eles são os mais convenientes para entregar conjuntos de dados.

COPY TO#

Quando você quiser criar um arquivo CSV a partir de uma consulta SELECT, ou despejar todos os conteúdos de uma tabela em um arquivo CSV, você pode usar o comando “COPY … TO …”.

Usar uma consulta SELECT#

Quando quiser copiar um resultado definido para um ficheiro CSV, o formato do comando COPY é:

1
COPY (<select-query-here>) TO <file-path>;

Or, um exemplo mais real:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv';

Como pode ver, usamos o comando COPY que copia os resultados para um ficheiro CSV no sistema de ficheiros local. Você pode levar a consulta muito mais longe. Aqui está um exemplo de um projecto em que estou a trabalhar:

1
COPY (SELECT price_rules.* FROM quotes LEFT JOIN price_rules ON quotes.id = price_rules.chargeable_id where quotes.id = 437) TO '~/Desktop/exports/price_rules.csv' CSV;

Como pode ver, pode usar qualquer consulta SELECT que pode devolver um conjunto de resultados de dados. O que é um CSV sem cabeçalhos, certo? 🙂

>

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV HEADER;>

Adicionando a palavra-chave CABEÇALHO no final, serão incluídos cabeçalhos no arquivo CSV, que são os nomes das colunas da tabela.

Também, outra característica chave dos arquivos CSV são os delimitadores. Dependendo do delimitador de caracteres que você deseja que o arquivo CSV tenha, você pode especificar o caractere no comando:

1
COPY (SELECT * FROM people WHERE age > 21) TO '~/Desktop/adults.csv' CSV DELIMITER ',' HEADER;

Usando um nome de tabela#

Quando você quer que uma tabela inteira seja despejada em um CSV, o comando é realmente mais simples. Você só precisa especificar o nome da tabela e o arquivo alvo:

1
COPY people TO '~/Desktop/people.csv' CSV DELIMITER ',' HEADER;

É isso aí.

COPY FROM#

Agora, quando quiser injectar os dados do ficheiro CSV numa tabela, pode usar o comando “COPY &mldr; FROM &mldr;”. A sintaxe é muito semelhante, com apenas uma diferença chave:

>

1
COPY <table-name> FROM <file-path> DELIMITER ',' CSV HEADER;

Or, usando um exemplo da vida real:

>

>

>

>

1
>

COPY addresses FROM '~/Desktop/addresses.csv' DELIMITER ',' CSV HEADER;

>

>

Outro#

>

COPY é uma característica muito fixe e fixe do Postgres. Para a cervejaria, tentei manter este blogpost curto e simples. Se você tem algum pensamento e perguntas livre para me deixar um comentário. Ou, se você não se sentir tagarela, você pode passar para a COPYdocumentation.

Gostou deste artigo? Assine o mynewsletter e receba os meus novos posts na sua caixa de entrada. É curto e doce, saindo mensalmente para mais de 1.000 assinantes.

Deixe uma resposta

O seu endereço de email não será publicado.