CodeGym /Cursos /SQL SELF /Erros comuns ao fazer carga em massa de dados

Erros comuns ao fazer carga em massa de dados

SQL SELF
Nível 24 , Lição 4
Disponível

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?

  1. Confere seu arquivo CSV antes de carregar. Se estiver usando Excel ou Python, garante que todas as colunas estão com os tipos certos.
  2. 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?

  1. Garante que seu CSV está salvo em UTF-8.
  2. 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?

  1. Confere se o PostgreSQL tem acesso ao arquivo. No Linux, pode ser questão de permissão. Usa o comando chmod pra liberar:
    chmod 644 /path/to/file.csv
    
  2. Se estiver rodando do seu computador, usa o comando \COPY em vez de COPY.

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?

  1. Usa a opção ON CONFLICT pra tratar valores duplicados:
    INSERT INTO students (id, first_name, last_name)
    VALUES (1, 'John', 'Doe')
    ON CONFLICT (id) DO NOTHING;
    
  1. Se estiver usando COPY ou \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?

  1. Confere se o CSV tem valor pra todas as colunas obrigatórias.
  2. Se puder ter valor vazio, tira a restrição NOT NULL ou 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

  1. Sempre analisa e confere os dados antes de carregar.
  2. Usa tabelas temporárias pra tratar os dados antes.
  3. Ativa o log de erros e analisa eles.
  4. Se der conflito ou diferença, usa ON CONFLICT ou carrega numa tabela intermediária.
  5. 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!

1
Pesquisa/teste
Otimização de carga em massa, nível 24, lição 4
Indisponível
Otimização de carga em massa
Otimização de carga em massa
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION