Implementação de ORM com SQLAlchemy em Python

Conceitos Fundamentais do SQLAlchemy

SQLAlchemy é um framework ORM (Mapeamento Objeto-Relacional) amplamente utilizado em Python para operações em bancos de dados. Abordaremos seus principais componentes:

  • Engine: Gerenciador de conexões com o banco de dados
  • Session: Controlador de operações persistentes
  • Model: Classes que representam tabelas do banco
  • Query: Construtor de consultas à base de dados

Conexão com Banco de Dados

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# Configurar conexão
conexao = create_engine('sqlite:///dados.db', echo=False)
Sessao = sessionmaker(bind=conexao)
sessao_atual = Sessao()

Definição de Modelos

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base

Base = declarative_base()

class Cliente(Base):
    __tablename__ = 'clientes'
    
    cliente_id = Column(Integer, primary_key=True)
    nome = Column(String(50))
    contato = Column(String(100), unique=True)
    
    pedidos = relationship("Pedido", back_populates="comprador")

class Pedido(Base):
    __tablename__ = 'pedidos'
    
    pedido_id = Column(Integer, primary_key=True)
    produto = Column(String(100))
    comprador_id = Column(Integer, ForeignKey('clientes.cliente_id'))
    
    comprador = relationship("Cliente", back_populates="pedidos")

Operações Básicas

Criação de Tabelas

Base.metadata.create_all(bind=conexao)

Inserção de Dados

novo_cliente = Cliente(nome="Ana", contato="ana@exemplo.com")
sessao_atual.add(novo_cliente)
sessao_atual.commit()

Consulta de Registros

# Todos os registros
resultados = sessao_atual.query(Cliente).all()

# Filtro específico
cliente = sessao_atual.query(Cliente).filter_by(nome="Ana").first()

Atualização

cliente.contato = "novo_email@exemplo.com"
sessao_atual.commit()

Exclusão

sessao_atual.delete(cliente)
sessao_atual.commit()

Consulats Avançadas

from sqlalchemy import func, or_

# Ordenação e limite
registros = sessao_atual.query(Cliente).order_by(Cliente.nome.desc()).limit(5)

# Operadores lógicos
filtro = sessao_atual.query(Cliente).filter(
    or_(Cliente.nome.like("A%"), Cliente.contato.contains("exemplo"))
)

# Agregação
total = sessao_atual.query(func.count(Cliente.cliente_id)).scalar()

Relacionamentos

# Criação com relacionamento
cliente = Cliente(nome="Carlos")
novo_pedido = Pedido(produto="Notebook", comprador=cliente)
sessao_atual.add(novo_pedido)
sessao_atual.commit()

# Acesso a objetos relacionados
for pedido in cliente.pedidos:
    print(pedido.produto)

Gerenciamento de Transações

try:
    cliente = Cliente(nome="Temporário")
    sessao_atual.add(cliente)
    sessao_atual.commit()
except Exception:
    sessao_atual.rollback()

Boas Práticas

  • Gerenciar sessões por contexto de requisição
  • Implementar tratamento de exceções
  • Otimizar queries com carregamento antecipado
  • Configurar pools de conexão adequadamente
from contextlib import contextmanager

@contextmanager
def gerenciador_sessao():
    db = Sessao()
    try:
        yield db
        db.commit()
    except:
        db.rollback()
        raise
    finally:
        db.close()

Tags: SQLAlchemy ORM Python BancoDeDados CRUD

Publicado em 7-1 06:25