Skip to main content

Power BI com PostgreSQL

A integração com o Power BI é mais robusta quando utilizamos um banco de dados como intermediário. Este guia demonstra como extrair dados da nossa API, carregá-los em um banco de dados PostgreSQL e, em seguida, conectar o Power BI a esse banco de dados para visualização e análise.

Pré-requisitos

  1. Python 3.6+: Certifique-se de que você tenha o Python instalado.
  2. Bibliotecas Python: Instale as bibliotecas necessárias:
    pip install requests pandas psycopg2-binary
  3. PostgreSQL: Tenha um servidor PostgreSQL em execução e as credenciais de acesso (usuário, senha, host, porta e nome do banco de dados).
  4. Power BI Desktop: Instale a aplicação Power BI Desktop.
  5. Token de Acesso: Obtenha um token de acesso para a nossa API.

Exemplo de Código

O script Python abaixo realiza as seguintes ações:

  1. Busca de Proposições: Faz uma requisição para o endpoint recuperaProposicoes da nossa API.
  2. Conexão com o PostgreSQL: Estabelece uma conexão com o banco de dados.
  3. Criação da Tabela: Garante que a tabela para armazenar as proposições exista.
  4. Carregamento de Dados: Insere as proposições na tabela do PostgreSQL.
import requests
import pandas as pd
import psycopg2
from psycopg2.extras import execute_values
import json

# --- Configuração ---
# Substitua com seu token de acesso
ACCESS_TOKEN = "SEU_TOKEN_DE_ACESSO"
# URL da nossa API
API_URL = "https://api-public.sigalei.com/graphql"

# --- Configuração do Banco de Dados PostgreSQL ---
DB_CONFIG = {
"dbname": "seu_banco_de_dados",
"user": "seu_usuario",
"password": "sua_senha",
"host": "localhost",
"port": "5432"
}

# --- 1. Buscar Proposições ---
def fetch_propositions():
"""Busca proposições da nossa API."""
query = """
query RecuperaProposicoes {
recuperaProposicoes(
filter: {
siglaTipo: "PL"
ano: 2023
}
first: 50 # Aumentando o número de proposições
) {
edges {
node {
id
siglaTipo
numero
ano
ementa
}
}
}
}
"""
headers = {
"Authorization": f"Bearer {ACCESS_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(API_URL, json={"query": query}, headers=headers)
response.raise_for_status()
return [p["node"] for p in response.json()["data"]["recuperaProposicoes"]["edges"]]

# --- 2. Carregar Dados no PostgreSQL ---
def load_data_to_postgres(propositions):
"""Conecta ao PostgreSQL e carrega os dados das proposições."""
df = pd.DataFrame(propositions)
if df.empty:
print("Nenhuma proposição encontrada para carregar.")
return

conn = None
try:
print("Conectando ao banco de dados PostgreSQL...")
conn = psycopg2.connect(**DB_CONFIG)
cursor = conn.cursor()

print("Criando a tabela 'proposicoes' se não existir...")
cursor.execute("""
CREATE TABLE IF NOT EXISTS proposicoes (
id VARCHAR(255) PRIMARY KEY,
sigla_tipo VARCHAR(50),
numero INT,
ano INT,
ementa TEXT
);
""")

print("Inserindo/Atualizando dados na tabela 'proposicoes'...")
# Usando INSERT ... ON CONFLICT para evitar duplicatas e atualizar registros existentes
table_columns = ['id', 'sigla_tipo', 'numero', 'ano', 'ementa']
df_columns = ['id', 'siglaTipo', 'numero', 'ano', 'ementa']

# Preparando os dados para inserção
values = df[df_columns].values.tolist()

insert_query = f"""
INSERT INTO proposicoes ({', '.join(table_columns)}) VALUES %s
ON CONFLICT (id) DO UPDATE SET
sigla_tipo = EXCLUDED.sigla_tipo,
numero = EXCLUDED.numero,
ano = EXCLUDED.ano,
ementa = EXCLUDED.ementa;
"""

execute_values(cursor, insert_query, values)

conn.commit()
print(f"{len(df)} registros foram inseridos/atualizados com sucesso!")

except psycopg2.Error as e:
print(f"Erro no banco de dados: {e}")
finally:
if conn:
cursor.close()
conn.close()
print("Conexão com o PostgreSQL fechada.")

# --- Execução ---
if __name__ == "__main__":
try:
print("Buscando proposições...")
propositions = fetch_propositions()

if propositions:
print(f"{len(propositions)} proposições encontradas.")
load_data_to_postgres(propositions)
else:
print("Nenhuma proposição foi retornada pela API.")

except requests.exceptions.RequestException as e:
print(f"Erro na requisição: {e}")
except KeyError as e:
print(f"Erro ao processar os dados da API: {e}")
except Exception as e:
print(f"Ocorreu um erro inesperado: {e}")

Instruções de Implementação

  1. Substitua os Placeholders:

    • No script Python, substitua SEU_TOKEN_DE_ACESSO pelo seu token de acesso à nossa API.
    • Atualize o dicionário DB_CONFIG com as credenciais do seu banco de dados PostgreSQL.
  2. Execute o Script:

    • Salve o código em um arquivo (por exemplo, carregar_dados.py) e execute-o:
      python carregar_dados.py
    • O script buscará os dados e os carregará na tabela proposicoes do seu banco de dados.

Conectando o Power BI ao PostgreSQL

Depois que os dados estiverem no PostgreSQL, você pode conectá-lo ao Power BI:

  1. Abra o Power BI Desktop.
  2. Na guia Página Inicial, clique em Obter Dados e selecione Mais....
  3. Na janela Obter Dados, pesquise por PostgreSQL e selecione Banco de dados PostgreSQL. Clique em Conectar.
  4. Insira as Informações do Servidor:
    • Servidor: O host do seu banco de dados (ex: localhost).
    • Banco de Dados: O nome do banco de dados (ex: seu_banco_de_dados).
    • Deixe o Modo de Conectividade de Dados como Importar.
  5. Forneça as Credenciais:
    • Na próxima tela, você precisará fornecer o Nome de usuário e a Senha para se conectar ao seu banco de dados PostgreSQL.
  6. Selecione a Tabela:
    • Após a conexão ser estabelecida, o Power BI mostrará uma lista de tabelas disponíveis. Marque a caixa de seleção ao lado da tabela proposicoes.
    • Clique em Carregar.

Agora, os dados da tabela proposicoes estão disponíveis no Power BI. Você pode começar a criar relatórios, gráficos e dashboards para analisar as proposições legislativas.