Manejo de errores en SQLAlchemy

4 minutos de lectura

¿Cómo maneja los errores en SQLAlchemy? Soy relativamente nuevo en SQLAlchemy y aún no lo sé.

Antes de usar SQLAlchemy, hacía cosas como

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Pero ahora estoy codificando en SQLAlchemy y hago cosas como

user = User('Boda Cydo')
session.add(user)
session.commit()

¡Ninguna comprobación de errores en absoluto!

No me gusta este estilo de codificación sin verificación de errores.

¡Aconseje sobre cómo verificar y manejar errores en SQLAlchemy!

Atentamente, Boda Cydo.

avatar de usuario
nosklo

Tu ejemplo dice:

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Eso parece significar que desea generar una excepción si hay algún error en la consulta (con raise Error, db.error). Sin embargo, sqlalchemy ya lo hace por ti, así que

user = User('Boda Cydo')
session.add(user)
session.commit()

Es lo mismo. La parte de check-and-raise ya está dentro de SQLAlchemy.

Aquí hay una lista de los errores que sqlalchemy puede generar, tomados de help(sqlalchemy.exc) y help(sqlalchemy.orm.exc):

  • sqlalchemy.exc:
    • ArgumentError – Se genera cuando se proporciona un argumento de función no válido o en conflicto. Este error generalmente corresponde a errores de estado de tiempo de construcción.
    • CircularDependencyError – Provocado por ordenaciones topológicas cuando se detecta una dependencia circular
    • CompileError – Se genera cuando se produce un error durante la compilación de SQL
    • ConcurrentModificationError
    • DBAPIError – Se genera cuando falla la ejecución de una operación de base de datos. Si la operación que generó el error ocurrió en la ejecución de una instrucción SQL, esa instrucción y sus parámetros estarán disponibles en el objeto de excepción en el statement y params atributos El objeto de excepción envuelto está disponible en el orig atributo. Su tipo y propiedades son específicos de la implementación DB-API.
    • DataError Envuelve una DB-API DataError.
    • DatabaseError – Envuelve una DB-API DatabaseError.
    • DisconnectionError – Se detecta una desconexión en una conexión DB-API sin procesar. ser criado por un PoolListener para que el grupo de host fuerce una desconexión.
    • FlushError
    • IdentifierError – Se genera cuando un nombre de esquema supera el límite máximo de caracteres
    • IntegrityError – Envuelve una DB-API IntegrityError.
    • InterfaceError – Envuelve una DB-API InterfaceError.
    • InternalError – Envuelve una DB-API InternalError.
    • InvalidRequestError – Se le pidió a SQLAlchemy que hiciera algo que no puede hacer. Este error generalmente corresponde a errores de estado en tiempo de ejecución.
    • NoReferenceError – Criado por ForeignKey para indicar que una referencia no se puede resolver.
    • NoReferencedColumnError – Criado por ForeignKey cuando el referido Column no se puede localizar
    • NoReferencedTableError – Criado por ForeignKey cuando el referido Table no se puede localizar
    • NoSuchColumnError – Se solicita una columna inexistente de un RowProxy.
    • NoSuchTableError – La tabla no existe o no está visible para una conexión.
    • NotSupportedError – Envuelve una DB-API NotSupportedError.
    • OperationalError – Envuelve una DB-API OperationalError.
    • ProgrammingError – Envuelve una DB-API ProgrammingError.
    • SADeprecationWarning – Emitido una vez por uso de una API obsoleta.
    • SAPendingDeprecationWarning – Emitido una vez por uso de una API obsoleta.
    • SAWarning – Emitido en tiempo de ejecución.
    • SQLAlchemyError – Clase de error genérico.
    • SQLError – Se genera cuando falla la ejecución de una operación de base de datos.
    • TimeoutError – Se genera cuando se agota el tiempo de espera de un grupo de conexiones para obtener una conexión.
    • UnboundExecutionError – Se intentó SQL sin una conexión de base de datos para ejecutarlo.
    • UnmappedColumnError
  • sqlalchemy.orm.exc:
    • ConcurrentModificationError – Se han modificado filas fuera de la unidad de trabajo.
    • FlushError – Se detectó una condición no válida durante flush().
    • MultipleResultsFound – Se requería un solo resultado de la base de datos, pero se encontraron más de uno.
    • NoResultFound – Se requirió un resultado de la base de datos pero no se encontró ninguno.
    • ObjectDeletedError – A refresh() la operación no pudo volver a recuperar la fila de un objeto.
    • UnmappedClassError – Se solicitó una operación de mapeo para una clase desconocida.
    • UnmappedColumnError – Se solicitó operación de mapeo en una columna desconocida.
    • UnmappedError – QUE HACER
    • UnmappedInstanceError – Se solicitó una operación de mapeo para una instancia desconocida.

Intenté esto y me mostró el mensaje de error específico.

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

except SQLAlchemyError as e:
  error = str(e.__dict__['orig'])
  return error

Espero que esto ayude

  • error = str(e.orig) también funciona

    – GerritKruse

    5 de febrero a las 9:16


Para obtener el tipo de excepción, simplemente puede llamar a:

En primer lugar, importe exc de sqlalchemy

from sqlalchemy import exc

Para detectar tipos de errores:

    try:
        # any query
    except exc.SQLAlchemyError as e:
        print(type(e))

Esto le dará un tipo de excepción:
Producción:

<class 'sqlalchemy.exc.IntegrityError'>
<class 'sqlalchemy.exc.IntegrityError'>

SQLAlchemy generará una excepción en caso de error….

¿Ha sido útil esta solución?