Qué es un ORM y por qué se usa
Los ORM permiten trabajar con bases de datos usando objetos y clases en vez de escribir SQL manualmente todo el tiempo. Son una de las herramientas más usadas en backend moderno.
💡 La idea principal
Un ORM traduce objetos de Python a consultas SQL automáticamente.
🚀 La gran ventaja
Permite desarrollar más rápido y escribir menos SQL repetitivo.
📏 Regla práctica
ORM para el 80% del proyecto.
SQL crudo para queries complejas u optimización.
Qué hace realmente un ORM
Traducción objeto ↔ SQLEl ORM convierte operaciones hechas con objetos Python en consultas SQL reales.
| 🐍 Mundo Python | 🗄️ Mundo SQL |
|---|---|
| Clase | Tabla |
| Objeto | Fila |
| Atributo | Columna |
| Instancia | Registro |
| Método de query | SELECT / WHERE |
| save() | INSERT / UPDATE |
Operaciones básicas con Django
CRUD simplificadoModelo ORM
La tabla SQL se representa como una clase Python.
from django.db import models
class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(unique=True)
INSERT usando ORM
Crear registros sin escribir SQL manualmente.
# ORM
User.objects.create(
name="Gaston",
age=25,
)
-- SQL equivalente
INSERT INTO users (name, age)
VALUES ('Gaston', 25);
SELECT usando ORM
Consultar datos usando objetos.
# ORM
users = User.objects.filter(age__gt=18)
-- SQL equivalente
SELECT * FROM users
WHERE age > 18;
Ejemplo usando SQLAlchemy
ORM flexibleModelo SQLAlchemy
Las columnas SQL se definen usando atributos Python.
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String(100))
age = Column(Integer)
Query ORM
Consultas usando métodos Python encadenados.
# ORM
users = (
session.query(User)
.filter(User.age > 18)
.all()
)
-- SQL equivalente
SELECT * FROM users
WHERE age > 18;
Cuándo se usa SQL crudo
Control totalAunque uses ORM, muchas veces necesitas escribir SQL manualmente para queries complejas, optimización o reportes avanzados.
SQL crudo en Django
Ejecutar consultas SQL manuales desde Python.
from django.db import connection
with connection.cursor() as cursor:
cursor.execute(
"SELECT * FROM users WHERE age > %s",
[18],
)
rows = cursor.fetchall()
SQL crudo en SQLAlchemy
SQLAlchemy también permite ejecutar SQL manual.
from sqlalchemy import text
result = session.execute(
text("SELECT * FROM users WHERE age > :age"),
{"age": 18},
)
ORM vs SQL manual
Diferencias reales🧩 ORM
- Más rápido para desarrollar
- Menos SQL repetitivo
- Código más mantenible
- Más fácil de leer
- Ideal para CRUD común
- Abstracción de base de datos
⚙️ SQL Manual
- Control total de la query
- Más optimización posible
- Mejor para analytics
- Queries complejas
- CTEs y window functions
- Mayor complejidad
📊 Cuándo conviene cada uno (uso típico en proyectos)
🎯 Entonces, ¿cuál es la conclusión correcta?
- ORM Traduce objetos Python a consultas SQL automáticamente.
- Django Tiene un ORM integrado muy orientado a productividad.
- SQLAlchemy Es más flexible y separa mejor ORM y SQL.
- Raw SQL Sigue siendo importante para optimización y queries complejas.
- Clave Backend fuerte = entender ORM + entender SQL real.