Não sei onde você conseguiu essa sintaxe, mas
COPY
não leva uma lista de aliases de coluna como essa. Veja a ajuda:COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | PROGRAM 'command' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
(
AS
não é uma das opções listadas; para ver a saída completa, execute \d copy
no psql, ou veja o manual para a copy
comando on-line). Não há recurso de mapeamento em
COPY
que permite ler apenas algumas colunas do CSV de entrada. Seria muito útil, mas ninguém teve tempo/interesse/financiamento para implementá-lo ainda. É realmente apenas uma das muitas tarefas de transformação/filtragem de dados que as pessoas desejam de qualquer maneira. O PostgreSQL espera a lista de colunas fornecida em
COPY
estar na mesma ordem, da esquerda para a direita, do que está no arquivo CSV e ter o mesmo número de entradas que o arquivo CSV tem colunas. Então, se você escrever:COPY con (date,kgs)
então o PostgreSQL esperará um CSV de entrada com exatamente duas colunas . Ele usará a primeira coluna csv para o
"date"
coluna da tabela e a segunda coluna csv para o "kgs"
coluna da tabela. Não importa quais são os cabeçalhos CSV, eles serão ignorados se você especificar WITH (FORMAT CSV, HEADER ON)
, ou tratadas como linhas de dados normais se você não especificar HEADER
. PostgreSQL 9.4 adiciona
FROM PROGRAM
para COPY
, para que você possa executar um comando shell para ler o arquivo e filtrá-lo. Um simples script Python ou Perl faria o trabalho. Se for um arquivo pequeno, basta abrir uma cópia na planilha de sua escolha como um arquivo csv, excluir as colunas indesejadas e salvá-lo, então apenas a
date
e kgs
colunas permanecem. Como alternativa,
COPY
para uma tabela de preparo que tenha todas as mesmas colunas que o CSV
, então faça um INSERT INTO ... SELECT
para transferir apenas os dados desejados para a tabela de destino real.