Introducción
SQLAlchemy y Pydantic son dos herramientas esenciales para cualquier desarrollador Python: una para trabajar con bases de datos y la otra para validar datos. Sin embargo, siempre existió una brecha entre ambas. La solución a este problema es SQLModel, una ORM basada en Pydantic que combina lo mejor de ambos mundos.
SQLModel te permite usar modelos tipados de Pydantic como tablas ORM de SQLAlchemy. Esto simplifica el desarrollo, acelera la creación de APIs y elimina la duplicación de código entre los modelos de base de datos y los serializadores.
¿Qué es SQLModel y por qué usarla?
SQLModel es una biblioteca ORM moderna para Python, creada por Sebastián Ramírez (el creador de FastAPI) en 2021. Resuelve uno de los mayores problemas del desarrollo web: la duplicación de código entre los modelos de base de datos y los esquemas de validación de datos.
Principales ventajas de SQLModel
SQLModel ofrece a los desarrolladores una interfaz unificada para trabajar con bases de datos y validar datos. Sus principales ventajas incluyen:
- Modelo de datos único: un mismo modelo para la base de datos y la API
- Validación automática: validación de datos integrada gracias a Pydantic
- Tipado completo: soporte total de tipos de Python y tu IDE
- Compatibilidad: funciona con proyectos existentes de SQLAlchemy
- Asincronía: soporte nativo para async/await
Instalación y configuración
Instalación básica
pip install sqlmodel
Instalación con dependencias adicionales
Para trabajar con PostgreSQL:
pip install sqlmodel[postgresql]
Para soporte asíncrono:
pip install sqlmodel[async]
Instalación completa con todas las dependencias:
pip install "sqlmodel[postgresql,async]"
Conexión a la base de datos
from sqlmodel import SQLModel, create_engine
# SQLite (para desarrollo)
engine = create_engine("sqlite:///database.db")
# PostgreSQL
engine = create_engine("postgresql://usuario:contraseña@localhost/nombre_bd")
# MySQL
engine = create_engine("mysql+pymysql://usuario:contraseña@localhost/nombre_bd")
Fundamentos de SQLModel
Creación de un modelo básico
from sqlmodel import SQLModel, Field
from typing import Optional
class Usuario(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
nombre: str = Field(index=True)
email: str = Field(unique=True)
edad: int = Field(ge=0, le=150)
activo: bool = Field(default=True)
Parámetros de Field
SQLModel utiliza el Field extendido de Pydantic con funcionalidades adicionales:
class Producto(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
nombre: str = Field(max_length=100, index=True)
precio: float = Field(gt=0, description="Precio del producto")
categoria_id: int = Field(foreign_key="categoria.id")
creado_en: datetime = Field(default_factory=datetime.now)
Creación de tablas en la base de datos
from sqlmodel import SQLModel, create_engine
engine = create_engine("sqlite:///database.db")
# Crear todas las tablas
SQLModel.metadata.create_all(engine)
# Crear una tabla específica
Usuario.metadata.create_all(engine)
Operaciones CRUD con SQLModel
Creación de registros
from sqlmodel import Session
# Crear un solo registro
usuario = Usuario(nombre="Carlos", email="carlos@ejemplo.com", edad=30)
with Session(engine) as session:
session.add(usuario)
session.commit()
session.refresh(usuario) # Obtener el ID de la base de datos
print(f"Usuario creado con ID: {usuario.id}")
También en la biblioteca
Bcrypt en JavaScript (Node.js): guía completa con ejemplos
Trabajo con imágenes en C++: bibliotecas CImg y STB Image
Rate Limiting en JavaScript (Node.js): Guía completa de la biblioteca express-rate-limit
Trabajo con S3 y almacenamiento en la nube en C++: biblioteca AWS SDK para C++