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()