SQLAlchemy ORM: mapeie tabelas em classes Python
Chega de SQL manual. Modele seu banco de dados com classes Python de forma limpa.
O que é um ORM?
ORM significa Object-Relational Mapping. É uma técnica que permite interagir com o banco de dados usando objetos Python em vez de escrever SQL manualmente. O SQLAlchemy é o ORM mais popular do ecossistema Python e funciona com diversos bancos: PostgreSQL, MySQL, SQLite e outros.
A ideia central é simples: cada tabela do banco vira uma classe Python, e cada linha vira uma instância dessa classe.
pip install sqlalchemy
Configuração inicial
Para começar, você precisa criar uma engine (conexão com o banco) e uma base para seus modelos:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Session
engine = create_engine("sqlite:///meu_banco.db", echo=True)
class Base(DeclarativeBase):
pass
O parâmetro echo=True faz o SQLAlchemy imprimir as queries SQL geradas, o que é útil durante o desenvolvimento.
Definindo modelos
Um modelo é uma classe que herda de Base e representa uma tabela no banco:
from sqlalchemy import Column, Integer, String, Float, ForeignKey
from sqlalchemy.orm import relationship
class Produto(Base):
__tablename__ = "produtos"
id = Column(Integer, primary_key=True)
nome = Column(String(100), nullable=False)
preco = Column(Float, nullable=False)
categoria_id = Column(Integer, ForeignKey("categorias.id"))
categoria = relationship("Categoria", back_populates="produtos")
def __repr__(self):
return f"<Produto(nome='{self.nome}', preco={self.preco})>"
class Categoria(Base):
__tablename__ = "categorias"
id = Column(Integer, primary_key=True)
nome = Column(String(50), nullable=False)
produtos = relationship("Produto", back_populates="categoria")
Para criar as tabelas no banco:
Base.metadata.create_all(engine)
Operações CRUD
Com os modelos definidos, você pode criar, ler, atualizar e deletar registros usando Python puro:
from sqlalchemy.orm import Session
# Criar
with Session(engine) as session:
eletronicos = Categoria(nome="Eletronicos")
notebook = Produto(nome="Notebook", preco=3500.00, categoria=eletronicos)
session.add(eletronicos)
session.add(notebook)
session.commit()
# Ler
with Session(engine) as session:
produtos = session.query(Produto).filter(Produto.preco < 5000).all()
for p in produtos:
print(f"{p.nome}: R${p.preco:.2f}")
# Atualizar
with Session(engine) as session:
produto = session.query(Produto).filter_by(nome="Notebook").first()
produto.preco = 3200.00
session.commit()
# Deletar
with Session(engine) as session:
produto = session.query(Produto).filter_by(nome="Notebook").first()
session.delete(produto)
session.commit()
Consultas avançadas
O SQLAlchemy oferece uma API expressiva para consultas mais complexas:
from sqlalchemy import func
with Session(engine) as session:
# Contar produtos por categoria
resultado = (
session.query(
Categoria.nome,
func.count(Produto.id).label("total")
)
.join(Produto)
.group_by(Categoria.nome)
.all()
)
for categoria, total in resultado:
print(f"{categoria}: {total} produtos")
# Buscar com ordenacao e limite
caros = (
session.query(Produto)
.order_by(Produto.preco.desc())
.limit(5)
.all()
)
Conclusão
O SQLAlchemy transforma a interação com o banco de dados em algo natural para quem programa em Python. Você define modelos como classes, faz consultas com métodos encadeados e deixa o ORM gerar o SQL. Para projetos Flask, a extensão Flask-SQLAlchemy simplifica ainda mais a integração. Comece com SQLite para aprender e migre para PostgreSQL quando estiver em produção.