Validación de Emails Únicos en Bases de Datos con Pydantic y FastAPI

Clase 17 de 23Curso de FastAPI

Resumen

La validación efectiva de datos es crucial en el desarrollo de software, especialmente cuando se habla de correos electrónicos. Con herramientas como FastAPI y Pydantic, puedes asegurar no solo que tus e-mails tengan el formato adecuado, sino también que sean únicos dentro de tu base de datos.

¿Cómo validar el formato de e-mail con Pydantic?

Hasta ahora, posiblemente solo has validado tipos básicos, como cadenas o números. Para una validación más robusta, especialmente de correos electrónicos, utiliza tipos especializados de la biblioteca Pydantic. El tipo EmailStr te asegura que el correo contenga un arroba y termine con un dominio.

Para emplear esto correctamente:

  • Importa la clase específica desde Pydantic:
from pydantic import EmailStr
  • En tu modelo, cambia la declaración del campo de correo electrónico de:
email: str

a:

email: EmailStr

Esto añadirá automáticamente validaciones del formato correcto del correo electrónico.

¿Cómo asegurar que un e-mail es único?

Aunque validar formatos es básico, garantizar la unicidad es igualmente crítico. Necesitas comprobar que no existan registros duplicados en tu base de datos; para esto, es fundamental utilizar el decorador field_validator introducido en Pydantic versión 2.

Aquí tienes los pasos clave:

  1. Importa el decorador desde Pydantic:
from pydantic import field_validator
  1. Define en tu modelo una validación personalizada con un método de clase:
@field_validator('email')
@classmethod
def validate_email(cls, value):
    # conexión y consulta con la base de datos
    return value
  1. Implementa una consulta con SQLModel para verificar la existencia del correo en la base de datos:
from sqlmodel import Session, select
from db import engine

@field_validator('email')
@classmethod
def validate_email(cls, value):
    with Session(engine) as session:
        exists_query = select(Customer).where(Customer.email == value)
        exists = session.exec(exists_query).first()
        if exists:
            raise ValueError('This email is already registered')
    return value

Al ejecutar esto, evalúa automáticamente la unicidad del correo electrónico en cada petición.

¿Cómo probar que la validación funciona correctamente?

Verifica los resultados utilizando herramientas de prueba específicas, como tus endpoints:

  • Realiza pruebas insertando tanto correos inválidos en formato como duplicados.
  • Corrobora que la respuesta indique claramente qué errores sucedieron.

Este método te proporciona una validación coherente y un control preciso sobre los datos que ingresan a tu sistema.

Si implementas otros validadores o tienes inquietudes, utiliza los comentarios para compartir tus resultados o resolver cualquier duda.