2010-01-26 15 views
31

Come si gestiscono gli errori in SQLAlchemy? Sono relativamente nuovo a SQLAlchemy e non lo so ancora.Gestione degli errori in SQLAlchemy

Prima ho usato SQLAlchemy, vorrei fare le cose come

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

ma ora sono codifica in SQLAlchemy e faccio le cose come

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

Nessun controllo degli errori di sorta!

Non mi piace questo stile di codifica senza controllo degli errori.

Si prega di consigli su come controllare e gestire gli errori in SQLAlchemy!

Cordiali saluti, Boda Cydo.

+0

Date un'occhiata a esempio a sqlalchemy.org http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueConstraintExceptionHandling –

risposta

54

Il vostro esempio dice:

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

Questo sembra significare che si desidera sollevare un'eccezione se c'è qualche errore sulla query (con raise Error, db.error). Tuttavia sqlalchemy lo fa già per te - quindi

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

È lo stesso. La parte check-and-raise è già all'interno di SQLAlchemy.

Ecco una lista degli errori sqlalchemy si può alzare, tratte da help(sqlalchemy.exc) e help(sqlalchemy.orm.exc):

  • sqlalchemy.exc:
    • ArgumentError - sollevata quando un argomento di funzione non valida o in conflitto è in dotazione. Questo errore corrisponde generalmente a errori di stato del tempo di costruzione.
    • CircularDependencyError - Sollevata da tipi topologici quando viene rilevata una dipendenza circolare
    • CompileError - alzate quando si verifica un errore durante la compilazione SQL
    • ConcurrentModificationError
    • DBAPIError - alzate quando l'esecuzione di un'operazione di database fallisce. Se durante l'esecuzione di un'istruzione SQL è stata rilevata l'operazione di errore, tale istruzione e i relativi parametri saranno disponibili su l'oggetto eccezione negli attributi statement e params. L'oggetto eccezione avvolto è disponibile nell'attributo orig. Il tipo e le proprietà sono specifici dell'implementazione DB-API.
    • DataError Avvolge un'API DB DataError.
    • DatabaseError - Avvolge un'API DB DatabaseError.
    • DisconnectionError - Una disconnessione viene rilevata su una connessione API-DB non elaborata. essere sollevato da un PoolListener in modo che il pool host impone una disconnessione.
    • FlushError
    • IdentifierError - sollevata quando un nome di schema è oltre il limite di caratteri max
    • IntegrityError - avvolge una DB-API IntegrityError.
    • InterfaceError - Avvolge un'API DB InterfaceError.
    • InternalError - Avvolge un'API DB InternalError.
    • InvalidRequestError - SQLAlchemy è stato chiesto di fare qualcosa che non può fare. Questo errore corrisponde generalmente agli errori di stato del runtime.
    • NoReferenceError - Sollevato da ForeignKey per indicare che un riferimento non può essere risolto.
    • NoReferencedColumnError - Sollevato da ForeignKey quando il riferimento Column non può essere localizzato.
    • NoReferencedTableError - Sollevato da ForeignKey quando il riferimento Table non può essere individuato.
    • NoSuchColumnError - Una colonna inesistente è richiesta da un RowProxy.
    • NoSuchTableError - La tabella non esiste o non è visibile a una connessione.
    • NotSupportedError - Avvolge un'API DB NotSupportedError.
    • OperationalError - Avvolge un'API DB OperationalError.
    • ProgrammingError - Avvolge un'API DB ProgrammingError.
    • SADeprecationWarning - Rilasciato una volta per utilizzo di un'API obsoleta.
    • SAPendingDeprecationWarning - Emesso una volta per utilizzo di un'API obsoleta.
    • SAWarning - Rilasciato in fase di esecuzione.
    • SQLAlchemyError - Classe errore generica.
    • SQLError - Sollevato quando l'esecuzione di un'operazione del database non riesce.
    • TimeoutError - Sollevato quando un pool di connessioni scade per ottenere una connessione.
    • UnboundExecutionError - SQL è stato tentato senza una connessione al database per eseguirlo.
    • UnmappedColumnError
  • sqlalchemy.orm.exc:
    • ConcurrentModificationError - Righe sono stati modificati al di fuori dell'unità di lavoro.
    • FlushError - È stata rilevata una condizione non valida durante flush().
    • MultipleResultsFound - È stato richiesto un singolo database, ma ne sono stati trovati più di uno.
    • NoResultFound - È stato richiesto un risultato del database ma non è stato trovato alcun risultato.
    • ObjectDeletedError - Un'operazione refresh() non è riuscita a recuperare nuovamente la riga di un oggetto.
    • UnmappedClassError - È stata richiesta un'operazione di associazione per una classe sconosciuta.
    • UnmappedColumnError - L'operazione di mappatura è stata richiesta su una colonna sconosciuta.
    • UnmappedError - TODO
    • UnmappedInstanceError - È stata richiesta un'operazione di associazione per un'istanza sconosciuta.
2

SQLAlchemy solleva un'eccezione in caso di errore ....

+0

Ci puoi dire di più? – bodacydo

+0

Le eccezioni sono in due moduli diversi: sqlalchemy.exc e sqlalchemy.orm.exc. Le eccezioni vengono sollevate automaticamente quando si verifica un errore, a differenza del codice nell'esempio in cui devi farlo tu stesso ... – tholo