Extrator de dados com Python
- #SQL
- #Python
Olá a todos!
Neste artigo, gostaria de compartilhar uma de minhas primeiras experiências como desenvolvedor/engenheiro de dados (tenho até medo de me autointitular desenvolvedor e receber hate xD) ao criar duas soluções de automação para a extração de dados de um banco de dados Oracle, utilizando Python. Ao longo deste texto, vou detalhar os desafios que enfrentei, as tecnologias que utilizei e os resultados alcançados.
Projeto 1: Automatizando a Extração e Manipulação de Dados
O primeiro projeto que abordei consistiu na criação de um extrator de dados do banco de dados Oracle e na subsequente incorporação desses dados em um arquivo Excel. Isso envolveu a utilização das bibliotecas oracleDB, pandas e openpyxl.
Primeiro, estabeleci uma conexão com o banco de dados Oracle e executei uma consulta SQL para obter os dados necessários. A biblioteca oracleDB foi fundamental para a realização desta tarefa, pois me proporcionou uma maneira fácil e eficiente de interagir com o banco de dados.
conection = oracledb.connect(conection_string) cursor = conection.cursor() cursor.execute(query) SELECT = cursor.fetchall()
Os dados extraídos foram então transformados em um DataFrame utilizando a biblioteca pandas, o que facilitou a manipulação e a formatação dos dados.
resultado_df = pd.DataFrame(resultado, columns=column_names)
Um dos aspectos interessantes deste projeto foi a implementação da lógica para adicionar os dados ao arquivo Excel. Isso foi alcançado usando a biblioteca openpyxl.
De fato a parte mais desafiadora foi a limpeza e formatação dos dados, pois ao receber os dados pela biblioteca OracleDB do banco, os dados vieram no tipo LOB (Large Object), que é um tipo de dado projetado para armazenar grandes volumes de informações binárias. Bancos de dados relacionais tradicionais, como o Oracle, utilizam esse tipo de dado para acomodar informações que excedem os limites de tamanho de um campo de dados convencional.
for row in SELECT:
campos = []
for campo in row:
if isinstance(campo, bytes):
# Tratar campos do tipo bytes
campo_str = campo.decode('utf-8')
elif isinstance(campo, oracledb.LOB):
# Tratar campos do tipo LOB
campo_str = campo.read().decode('utf-8')
else:
# Converter campo para string
campo_str = str(campo)
campos.append(campo_str)
resultado_f.append(campos)
Neste trecho realizo a limpeza dos dados do tipo 'bytes' (para tornar esses dados legíveis, utilizamos a função .decode('utf-8')) e 'oracledb.LOB' (utilizei: .read().decode('utf-8'))
Obs. A gravação dos dados em Excel e disponibilização do arquivo em um diretório compartilhado foram exigências do setor solicitante.
Projeto 2: Integração de Interface Gráfica para Personalização
No segundo projeto, elevei a automação a um novo patamar, incorporando uma interface gráfica para interagir com o usuário. A biblioteca Tkinter foi escolhida para construir essa interface intuitiva e permitir ao usuário escolher a tabela e o período de extração de dados.
janela = Tk() janela.title("Extração de relatórios")
janela.geometry('500x500')
def selecionar_opcao():
global data_formatada
data_formatada = data_digitada.get()
data_formatada = datetime.datetime.strptime(data_formatada, "%m/%Y").strftime("%Y%m")
selected_option = var.get()
if selected_option == 'Benefícios': benefícios()
elif selected_option == 'Folha - SRD': folha()
Dentro das funções de extração (beneficios e folha), a abordagem foi semelhante ao Projeto 1, mas com a personalização da consulta baseada nas escolhas do usuário. A interface gráfica forneceu uma maneira mais amigável para que os usuários selecionassem a tabela e a data para a extração.
Outra ponto importante a ser mencionado é que este projeto foi solicitado por diversos setores da empresa onde me encontro empregado atualmente, e ao longo dos meses fui aperfeiçoando ele. Crie tasks no TaskScheduler do windows, apontei para um .bat do projeto1, e o mantive em uma máquina virtual para conseguir realizar extrações mensais, semanais, diárias ou até mesmo horárias sem a necessidade de interferência humana. Com o tempo surgiu a necessidade da extração de relatórios de períodos específicos, então acabei desenvolvendo o projeto2. Infelizmente na época que comecei não tinha o devido conhecimento de git e github, então não tenho a maioria das versões passadas dele.
Espero que este artigo seja inspirador para outros desenvolvedores que estejam enfrentando projetos semelhantes. Fiquem a vontade caso queiram visualizar ou utilizar o código, que está disponível em meu github :).
Repo: https://github.com/gabrielgreco1/data_extraction_rpa
Edit1: Acabei esquecendo de mencionar um ponto muito importante, como podem ver no código há diversos "prints". Realizo os prints pois na criação do .bat eu direciono um arquivo de log, então tudo que é printado durante a execução da rotina é extraindo em um arquivo log.txt:
Arquivo .bat:
cd C:\Extracao_final
python Extracao.py >> log.txt
Arquivo log.txt:
Conexao bem-sucedida com o banco de dados Oracle
Dados extraidos com sucesso! Periodo: 20230701 ate 20230815
Dados adicionados na planilha com sucesso!
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Conexao bem-sucedida com o banco de dados Oracle
Dados extraidos com sucesso! Periodo: 20230701 ate 20230816
Dados adicionados na planilha com sucesso!
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Conexao bem-sucedida com o banco de dados Oracle
Dados extraidos com sucesso! Periodo: 20230701 ate 20230817
Dados adicionados na planilha com sucesso!
-------------------------------------------------------------------------
-------------------------------------------------------------------------
Conexao bem-sucedida com o banco de dados Oracle
Dados extraidos com sucesso! Periodo: 20230701 ate 20230818
Dados adicionados na planilha com sucesso!
-------------------------------------------------------------------------
E muito obrigado pelos comentários pessoal, fico feliz de terem gostado do projeto, espero que possa ajudar vocês em algum momento :D