Incrementando um fluxo de ETL com pgloader

Em uma postagem anterior vimos como criar um fluxo, agora vamos apenas incrementar o que já fizemos.
Já temos o postgres configurado.

Já temos o pgloader instalado

Já temos o script de carga funcionando.

Agora vamos incrementar este script para que seja possível fazer uma carga completa desde download do arquivo em extensão .zip até o carga de dados na instância do banco de dados.

Em resumo vamos fazer o seguinte:

  • Após fazer o download do .zip
  • extrair para um local temporário (descompactar)
  • dropar tabela se existir
  • criar a tabela

Em resumo a carga de dados já foi resolvida.

Agora vamos apenas incrementar o nosso script para que ele possa fazer as tarefas de dropar a tabela e criar a tabela, auto contida em um mesmo script.

BEFORE LOAD DO
     $$ DROP TABLE IF EXISTS empresa; $$,
     $$ CREATE TABLE empresa (
         CNPJ INTEGER PRIMARY KEY,
         RAZAO VARCHAR(150),
         NATUREZAJURIDICA VARCHAR(150),
         QUALIFICRESPONSAVEL VARCHAR(150),
         CAPITALSOCIAL VARCHAR(32),
         PORTEDAEMPRESA VARCHAR(2),
         ENTEFEDERATIVO VARCHAR(64)
     ); $$;

Para isso vamos adicionar uma nova seção no arquivo que faz a nossa carga de dados, a versão final do arquivo vai ficar assim:

LOAD CSV
   FROM FILENAME MATCHING ~/K3241\.K03200Y0\.D20108\.EMPRECSV/
   HAVING FIELDS
   (
        CNPJ,
        RAZAO,
        NATUREZAJURIDICA,
        QUALIFICRESPONSAVEL,
        CAPITALSOCIAL,
        PORTEDAEMPRESA,
        ENTEFEDERATIVO
   )
   INTO postgresql://postgres:admin@localhost:5432/cnpjs
    TARGET TABLE empresa
    TARGET COLUMNS (
        CNPJ,
        RAZAO,
        NATUREZAJURIDICA,
         QUALIFICRESPONSAVEL,
         CAPITALSOCIAL,
         PORTEDAEMPRESA,
         ENTEFEDERATIVO
   ) WITH truncate,
        skip header = 64370,
        fields optionally enclosed by '"',
        fields escaped by double-quote,
        fields terminated by ';'
    SET work_mem to '32 MB', maintenance_work_mem to '64 MB'
    BEFORE LOAD DO
     $$ drop table if exists empresa; $$,
     $$ create table empresa (
         CNPJ integer primary key,
         RAZAO varchar(150),
         NATUREZAJURIDICA varchar(150),
         QUALIFICRESPONSAVEL varchar(150),
         CAPITALSOCIAL varchar(32),
         PORTEDAEMPRESA varchar(32),
         ENTEFEDERATIVO varchar(64)
     ); $$;

Com esta adição, agora o nosso script vai fazer o drop e create table em apenas uma passada. Isso vai ajudar na hora de montar os dados, e facilitar a manutenção no script.