Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Manipulação de Banco de Dados com SQLAlchemy ORM – Feedback Solicitado

Olá pessoal,

Finalizei o desafio proposto e gostaria de compartilhar minha solução para manipular um banco de dados local usando SQLAlchemy com ORM (Object-Relational Mapping). Estou enviando aqui para receber feedback sobre a abordagem utilizada.

Contexto do Desafio

A missão foi:

  1. Criar um banco de dados local com SQLAlchemy.
  2. Carregar os dados de um arquivo CSV nesse banco.
  3. Realizar três operações:
    • Atualizar o rendimento anual do cliente com ID 6840104 para 300000.
    • Excluir o cliente com ID 5008809.
    • Inserir um novo cliente conforme especificação dada.

Minha Solução

1. Importações e criação do banco de dados

import pandas as pd
from sqlalchemy import create_engine

# Criação do engine SQLite
engine = create_engine('sqlite:///dados/clientes_banco_orm.db')

2. Exploração inicial dos dados CSV

Antes de criar a estrutura da tabela, é importante explorar os dados:

# Leitura do arquivo CSV
url = 'dados/clientes_banco.csv'
df = pd.read_csv(url)

# Visualização inicial
df.head()

3. Inspeção dos tipos de dados

df.dtypes

Essa etapa nos ajuda a definir corretamente os tipos de colunas na tabela SQL.

4. Definindo a classe ORM com base no CSV

from sqlalchemy import Column, Integer, String, Float
from sqlalchemy.orm import declarative_base, Session

Base = declarative_base()

class Cliente(Base):
    __tablename__ = 'clientes'

    ID_Cliente = Column(Integer, primary_key=True)
    Idade = Column(Integer)
    Grau_escolaridade = Column(String)
    Estado_civil = Column(String)
    Tamanho_familia = Column(Integer)
    Categoria_de_renda = Column(String)
    Ocupacao = Column(String)
    Anos_empregado = Column(Integer)
    Rendimento_anual = Column(Float)
    Tem_carro = Column(Integer)
    Moradia = Column(String)

5. Criando a tabela no banco

Base.metadata.create_all(engine)

6. Inserindo os dados do CSV no banco

df.to_sql('clientes', engine, index=False, if_exists='replace')

7. Atualizando, excluindo e inserindo registros

with Session(engine) as session:
    # Atualizar rendimento
    cliente = session.query(Cliente).filter_by(ID_Cliente=6840104).first()
    if cliente:
        cliente.Rendimento_anual = 300000

    # Excluir cliente
    cliente = session.query(Cliente).filter_by(ID_Cliente=5008809).first()
    if cliente:
        session.delete(cliente)

    # Inserir novo cliente
    novo_cliente = Cliente(
        ID_Cliente=6850985,
        Idade=33,
        Grau_escolaridade="Doutorado",
        Estado_civil="Solteiro",
        Tamanho_familia=1,
        Categoria_de_renda="Empregado",
        Ocupacao="TI",
        Anos_empregado=2,
        Rendimento_anual=290000,
        Tem_carro=0,
        Moradia="Casa/apartamento próprio"
    )
    session.add(novo_cliente)
    session.commit()

8. Visualizando os dados atualizados

with Session(engine) as session:
    # Verificar cliente atualizado
    cliente_atualizado = session.query(Cliente).filter_by(ID_Cliente=6840104).first()
    print(cliente_atualizado.__dict__ if cliente_atualizado else "Não encontrado")

    # Verificar cliente excluído
    cliente_excluido = session.query(Cliente).filter_by(ID_Cliente=5008809).first()
    print(cliente_excluido.__dict__ if cliente_excluido else "Não encontrado")

    # Verificar cliente inserido
    cliente_inserido = session.query(Cliente).filter_by(ID_Cliente=6850985).first()
    print(cliente_inserido.__dict__ if cliente_inserido else "Não encontrado")S

Considerações Finais

Utilizar o SQLAlchemy com ORM trouxe mais clareza e facilidade na manipulação do banco de dados, especialmente ao trabalhar com objetos Python em vez de escrever SQL puro. A integração com o Pandas também foi muito útil para carregar os dados iniciais.

No entanto, fico no aguardo do feedback de vocês para validar se segui boas práticas e como posso melhorar:

  • Minha definição da classe Cliente está adequada?
  • Há melhores práticas para lidar com exceções ou erros durante as operações?

Agradeço desde já pela colaboração!

2 respostas
solução!

Olá Carlos, tudo bem?

Parabéns por concluir o desafio! Sua solução está bem estruturada e cobre todos os requisitos propostos.

Sobre suas dúvidas, sua definição da classe Cliente está adequada. Você usou corretamente os tipos de dados do SQLAlchemy para mapear as colunas do CSV. Isso garante que os dados sejam armazenados corretamente no banco de dados.

Sobre as exceções, é sempre uma boa prática lidar com exceções, principalmente quando se trabalha com operações de banco de dados. Você pode usar um bloco try-except ao redor das operações de sessão para capturar e tratar possíveis erros. Isso pode ajudar a identificar problemas sem que o programa falhe completamente.

try:
    with Session(engine) as session:
        # Suas operações de banco de dados
        session.commit()
except Exception as e:
    print(f"Ocorreu um erro: {e}")

No geral, você já está seguindo práticas recomendadas ao usar o SQLAlchemy com ORM. Continue assim!

Espero ter ajudado.

Qualquer dúvida que surgir, compartilhe no fórum.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado pela orientação, Monalisa Silva!

Realmente não tinha reparado na importância de incluir o tratamento de exceções nesse momento. Há poucos dias finalizei o curso "Python para Data Science: trabalhando com funções, estruturas de dados e exceções", e ainda estou consolidando esse aprendizado.

Ficou claro agora que essa etapa é essencial para garantir a robustez do código, especialmente ao lidar com operações de banco de dados, onde imprevistos como falhas na conexão ou inconsistências nos dados podem acontecer.