Quero copiar um arquivo CSV para uma tabela Postgres. Existem cerca de 100 colunas nesta tabela, então não quero reescrevê-las se não for necessário.
Estou usando o \copy table from 'table.csv' delimiter ',' csv;
comando, mas sem uma tabela criada eu consigo ERROR: relation "table" does not exist
. Se eu adicionar uma tabela em branco, não recebo nenhum erro, mas nada acontece. Tentei este comando duas ou três vezes e não houve saída ou mensagens, mas a tabela não foi atualizada quando a verifiquei através do PGAdmin.
Existe uma maneira de importar uma tabela com cabeçalhos incluídos como estou tentando fazer?
postgresql
csv
postgresql-copy
Stanley Cup Phil
fonte
fonte
table
? Muito confuso. A tabela existe ou deseja criá-la com base no CSV? (você não pode)\copy table(column1, column2, ...) from 'table.csv' delimiter ',' csv;
sem sorte também. Idealmente, a tabela poderia ser criada apenas por meio do CSV e usar os cabeçalhos desse arquivo.Respostas:
Isso funcionou. A primeira linha continha nomes de colunas.
fonte
COPY
não cria uma tabela ou adiciona colunas a ela, ele adiciona linhas a uma tabela existente com suas colunas existentes. Presumivelmente, o solicitante deseja automatizar a criação de ~ 100 colunas eCOPY
não tem essa funcionalidade, pelo menos a partir do PG 9.3.ADD
dados.syntax error at or near "HEADER" LINE 2: delimiter ',' CSV HEADER
em aws redshift.Com a biblioteca Python
pandas
, você pode criar facilmente nomes de coluna e inferir tipos de dados de um arquivo csv.O
if_exists
parâmetro pode ser definido para substituir ou anexar a uma tabela existente, por exemplodf.to_sql('pandas_db', engine, if_exists='replace')
. Isso também funciona para tipos de arquivo de entrada adicionais, documentos aqui e aqui .fonte
pd.read_excel
, em vez depd.read_csv
. Eu atualizei a resposta.df.to_sql()
é MUITO LENTO, para acelerar isso você pode usar d6tstack . Ele também cuida das mudanças de esquema.Alternativa por terminal sem permissão
A documentação da página em NOTES diz
Então, geralmente, usando
psql
ou qualquer cliente, mesmo em um servidor local, você tem problemas ... E, se você está expressando comando COPY para outros usuários, por exemplo. em um README do Github, o leitor terá problemas ...A única maneira de expressar caminho relativo com as permissões do cliente é usando STDIN ,
como lembrado aqui :
fonte
Eu uso esta função há algum tempo sem problemas. Você só precisa fornecer as colunas numéricas que existem no arquivo csv, e ele pegará os nomes dos cabeçalhos da primeira linha e criará a tabela para você:
fonte
set schema 'data';
para o que for seu casoVocê pode usar o d6tstack, que cria a tabela para você e é mais rápido do que pd.to_sql () porque usa comandos de importação de banco de dados nativos. Suporta Postgres, MYSQL e MS SQL.
Também é útil para importar vários CSVs, resolver alterações de esquema de dados e / ou pré-processar com pandas (por exemplo, para datas) antes de gravar no banco de dados, veja mais abaixo no caderno de exemplos
fonte