- ETL = Extract (buscar dados), Transform (limpar e formatar), Load (gravar no destino)
- Stack mínima: Python 3.11 + pandas + SQLAlchemy + psycopg2 + python-dotenv
- Nunca misture lógica de extração com transformação — separe em funções distintas
- Use upsert (INSERT ON CONFLICT DO UPDATE) para idempotência — rodar duas vezes não gera duplicatas
- Agende com CRON no Linux ou Task Scheduler no Windows — sem Airflow para ETLs simples
O que é ETL e quando você precisa de um
ETL significa Extract, Transform, Load. É o processo de pegar dados de uma ou mais fontes, transformá-los no formato que você precisa e carregá-los em um banco de dados analítico.
Você precisa de um ETL quando:
- Tem dados em múltiplos sistemas (CRM + ERP + planilha) e precisa unificá-los.
- O sistema de origem não tem a estrutura ideal para análise — precisa transformar.
- Precisa de histórico — sistemas transacionais sobrescrevem dados; o ETL guarda o histórico.
- Quer alimentar um dashboard com dados atualizados periodicamente.
Um ETL bem feito pode ser executado várias vezes sem consequência. Use sempre upsert (INSERT ON CONFLICT) em vez de INSERT simples. Você vai precisar reprocessar dados mais vezes do que pensa.
Estrutura do projeto
etl-projeto/
├── .env # credenciais (não versionar)
├── requirements.txt
├── extract/
│ ├── __init__.py
│ ├── api_source.py # extrai de API REST
│ └── csv_source.py # extrai de arquivos CSV/Excel
├── transform/
│ ├── __init__.py
│ └── normalize.py # limpeza e padronização
├── load/
│ ├── __init__.py
│ └── postgres.py # grava no PostgreSQL
└── main.py # orquestra o pipeline
# requirements.txt
pandas==2.2.1
sqlalchemy==2.0.29
psycopg2-binary==2.9.9
python-dotenv==1.0.1
requests==2.31.0
openpyxl==3.1.2Adicione .env ao .gitignore no primeiro commit. Credenciais de banco em repositório git são o vetor de ataque número 1 em projetos pequenos. Use .env.example como documentação das variáveis necessárias.