Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

337
Vistas
¿Debo codificar Postgres para encontrarme con una excepción?

Quiero optimizar la cantidad de llamadas que hace mi API a la base de datos. Pero, ¿está bien dejar que Postgres se ejecute en un error de restricción única? Por ejemplo al registrar usuarios tengo dos opciones:

 from app.models import Users from tortoise.exceptions import DoesNotExist try: await Users.get(email=email) raise HTTPException( status_code=HTTP_400_BAD_REQUEST, detail="User already exists" ) except DoesNotExist: user = await Users.create(email, hashed_pw)

Esto haría dos llamadas a la base de datos, pero las excepciones ocurrirían en Python. Tenga en cuenta que no se lanza ningún error o excepción al final de postgres. Postgres simplemente devuelve nill, que en el extremo de python se interpreta como DoesNotExist. Otra solución sería esta:

 from app.model import Users from asyncpg.exceptions import UniqueViolationError try: user = await Users.create(email, hashed_pw) except UniqueViolationError: raise HTTPException( status_code=HTTP_400_BAD_REQUEST, detail="User already exists" )

Esto solo haría una única llamada a la base de datos, sin embargo, se produciría un error en la base de datos de postgres. Obviamente, me parece que la segunda implementación sería más eficiente, pero ¿está bien crear una excepción al final de Postgres?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Su primer código solo funcionaría de manera confiable si tiene transacciones o bloqueos involucrados. De lo contrario, si dos solicitudes para crear un usuario con el mismo correo electrónico (sé que esto es poco probable en este caso) llegan a su API, ambas podrían obtener como resultado DoesNotExist y se ejecutarían await Users.create(email, hashed_pw) . Ese tipo de patrón a menudo se desaconseja.

Además, el uso de excepciones para el flujo de control también es algo que a menudo se considera una mala práctica.

Su segunda solución está bien, no hay problema con intentar crear una entrada y usar la expectativa que emite postgres para decirle a la solicitud que el usuario ya existe.

El primero estaría bien si tiene transacciones y si tiene una función como await Users.exists(email=email) que devuelve verdadero o falso.

Personalmente, preferiría la segunda, porque la restricción única ya hace la verificación que desea hacer, pero debe asegurarse de verificar si el mensaje de error que recibe es sobre la clave única para el email y no sobre algún otro error. .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda