Carga em massa de dados no PostgreSQL é tipo jogar tetris: todas as peças (dados) têm que encaixar certinho na tabela (estrutura do banco). Mas, igual nos jogos, sempre rolam uns erros que podem atrasar tudo ou até derrubar o processo. Você pode trombar com problemas de tipos de dados errados, codificação, registros duplicados e, às vezes, até uns erros de permissão que ninguém espera.
Quais são esses erros, como descobrir e evitar? Hoje vamos destrinchar os problemas mais comuns pra você virar ninja na carga em massa de dados.
Erros de estrutura de dados incompatível
Problemas com tipos de dados
Bem comum na hora de carregar dados é aparecer um erro assim:
ERROR: invalid input syntax for type integer: "abc"
CONTEXT: COPY students, line 3, column age: "abc"
Isso rola quando os dados no seu arquivo CSV não batem com o tipo esperado da coluna. Por exemplo, se na coluna age era pra ter número, mas aparece a string "abc". O PostgreSQL não sabe transformar texto em número e cancela a carga.
Como evitar?
- Confere seu arquivo CSV antes de carregar. Se estiver usando Excel ou Python, garante que todas as colunas estão com os tipos certos.
- Se mesmo assim der erro, tenta carregar os dados antes numa tabela temporária com todas as colunas como
TEXT, e depois converte:
UPDATE temp_students
SET age = CAST(age AS INTEGER)
WHERE age ~ '^\d+$';
Colunas ausentes
Se a estrutura da tabela não bate com os dados do CSV, o PostgreSQL vai reclamar. Tipo assim:
ERROR: missing data for column "email"
CONTEXT: COPY students, line 2: "John,Doe,21"
Isso geralmente acontece quando os cabeçalhos (ou a ordem das colunas) no CSV estão diferentes da tabela.
Como evitar? Quando usar o comando COPY, sempre passa a lista das colunas que quer preencher:
COPY students (first_name, last_name, age)
FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER;
Erros de codificação
Problemas com codificações diferentes
Se seu arquivo CSV foi salvo numa codificação diferente de UTF-8 (tipo Windows-1251), o PostgreSQL pode não entender o arquivo. Isso dá erro, principalmente se tiver caracteres cirílicos nos dados:
ERROR: invalid byte sequence for encoding "UTF8": 0xd0
CONTEXT: COPY students, line 1
Como evitar?
- Garante que seu CSV está salvo em UTF-8.
- Se não der, especifica a codificação do arquivo na hora de carregar:
COPY students FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER
ENCODING 'WIN1251';
Erros de acesso ao arquivo
Problemas de permissão
Se você usar o comando COPY, o PostgreSQL precisa ter acesso ao arquivo que está carregando. Se não tiver, vai aparecer erro:
ERROR: could not open file "/path/to/file.csv" for reading: Permission denied
Ou até:
ERROR: no such file or directory
Como evitar?
- Confere se o PostgreSQL tem acesso ao arquivo. No Linux, pode ser questão de permissão. Usa o comando
chmodpra liberar:chmod 644 /path/to/file.csv - Se estiver rodando do seu computador, usa o comando
\COPYem vez deCOPY.
Problemas com dados duplicados
Ao carregar dados em tabelas com restrição UNIQUE (tipo identificadores únicos), pode rolar conflito:
ERROR: duplicate key value violates unique constraint "students_pkey"
DETAIL: Key (id)=(1) already exists.
Isso acontece se no CSV tem registros duplicados ou se os dados já existem na tabela.
Como evitar?
- Usa a opção
ON CONFLICTpra tratar valores duplicados:INSERT INTO students (id, first_name, last_name) VALUES (1, 'John', 'Doe') ON CONFLICT (id) DO NOTHING;
- Se estiver usando
COPYou\COPY, carrega os dados antes numa tabela temporária e depois insere na principal tratando os duplicados.
Erros de valores vazios
No PostgreSQL, colunas com restrição NOT NULL não aceitam valores vazios. Se no seu CSV tiver coluna vazia, pode aparecer erro:
ERROR: null value in column "email" violates not-null constraint
Como evitar?
- Confere se o CSV tem valor pra todas as colunas obrigatórias.
- Se puder ter valor vazio, tira a restrição
NOT NULLou usa um valor padrão:
ALTER TABLE students ALTER COLUMN email SET DEFAULT 'unknown@example.com';
Erros no log
Falta de informação sobre erros
Se você carrega arquivos grandes, é importante guardar as informações dos erros. Infelizmente, o comando COPY não tem log de erro por padrão.
Como evitar? Configura o log de erros usando uma tabela separada. Por exemplo, cria uma tabela pra erros e manda pra lá os registros errados:
COPY students FROM '/path/to/file.csv'
DELIMITER ','
CSV HEADER
LOG ERRORS INTO error_log
REJECT LIMIT 100;
Resumo pra evitar erros
- Sempre analisa e confere os dados antes de carregar.
- Usa tabelas temporárias pra tratar os dados antes.
- Ativa o log de erros e analisa eles.
- Se der conflito ou diferença, usa
ON CONFLICTou carrega numa tabela intermediária. - Confere a codificação dos arquivos e ajusta as configs do servidor.
Carga em massa de dados pode ser um desafio, mas com o jeito certo você faz tudo rápido, seguro e eficiente. Quer testar o que aprendeu? Tenta carregar um CSV grandão num banco de testes e vê se tudo entra certinho!
GO TO FULL VERSION