SQLModel: ORM basado en Pydantic para Python

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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}")

Recommendations