| Viewing file:  exc.py (11.43 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
# sqlalchemy/exc.py# Copyright (C) 2005-2016 the SQLAlchemy authors and contributors
 # <see AUTHORS file>
 #
 # This module is part of SQLAlchemy and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
 
 """Exceptions used with SQLAlchemy.
 
 The base exception class is :exc:`.SQLAlchemyError`.  Exceptions which are
 raised as a result of DBAPI exceptions are all subclasses of
 :exc:`.DBAPIError`.
 
 """
 
 
 class SQLAlchemyError(Exception):
 """Generic error class."""
 
 
 class ArgumentError(SQLAlchemyError):
 """Raised when an invalid or conflicting function argument is supplied.
 
 This error generally corresponds to construction time state errors.
 
 """
 
 
 class NoSuchModuleError(ArgumentError):
 """Raised when a dynamically-loaded module (usually a database dialect)
 of a particular name cannot be located."""
 
 
 class NoForeignKeysError(ArgumentError):
 """Raised when no foreign keys can be located between two selectables
 during a join."""
 
 
 class AmbiguousForeignKeysError(ArgumentError):
 """Raised when more than one foreign key matching can be located
 between two selectables during a join."""
 
 
 class CircularDependencyError(SQLAlchemyError):
 """Raised by topological sorts when a circular dependency is detected.
 
 There are two scenarios where this error occurs:
 
 * In a Session flush operation, if two objects are mutually dependent
 on each other, they can not be inserted or deleted via INSERT or
 DELETE statements alone; an UPDATE will be needed to post-associate
 or pre-deassociate one of the foreign key constrained values.
 The ``post_update`` flag described at :ref:`post_update` can resolve
 this cycle.
 * In a :attr:`.MetaData.sorted_tables` operation, two :class:`.ForeignKey`
 or :class:`.ForeignKeyConstraint` objects mutually refer to each
 other.  Apply the ``use_alter=True`` flag to one or both,
 see :ref:`use_alter`.
 
 """
 def __init__(self, message, cycles, edges, msg=None):
 if msg is None:
 message += " (%s)" % ", ".join(repr(s) for s in cycles)
 else:
 message = msg
 SQLAlchemyError.__init__(self, message)
 self.cycles = cycles
 self.edges = edges
 
 def __reduce__(self):
 return self.__class__, (None, self.cycles,
 self.edges, self.args[0])
 
 
 class CompileError(SQLAlchemyError):
 """Raised when an error occurs during SQL compilation"""
 
 
 class UnsupportedCompilationError(CompileError):
 """Raised when an operation is not supported by the given compiler.
 
 
 .. versionadded:: 0.8.3
 
 """
 
 def __init__(self, compiler, element_type):
 super(UnsupportedCompilationError, self).__init__(
 "Compiler %r can't render element of type %s" %
 (compiler, element_type))
 
 
 class IdentifierError(SQLAlchemyError):
 """Raised when a schema name is beyond the max character limit"""
 
 
 class DisconnectionError(SQLAlchemyError):
 """A disconnect is detected on a raw DB-API connection.
 
 This error is raised and consumed internally by a connection pool.  It can
 be raised by the :meth:`.PoolEvents.checkout` event so that the host pool
 forces a retry; the exception will be caught three times in a row before
 the pool gives up and raises :class:`~sqlalchemy.exc.InvalidRequestError`
 regarding the connection attempt.
 
 """
 
 
 class TimeoutError(SQLAlchemyError):
 """Raised when a connection pool times out on getting a connection."""
 
 
 class InvalidRequestError(SQLAlchemyError):
 """SQLAlchemy was asked to do something it can't do.
 
 This error generally corresponds to runtime state errors.
 
 """
 
 
 class NoInspectionAvailable(InvalidRequestError):
 """A subject passed to :func:`sqlalchemy.inspection.inspect` produced
 no context for inspection."""
 
 
 class ResourceClosedError(InvalidRequestError):
 """An operation was requested from a connection, cursor, or other
 object that's in a closed state."""
 
 
 class NoSuchColumnError(KeyError, InvalidRequestError):
 """A nonexistent column is requested from a ``RowProxy``."""
 
 
 class NoReferenceError(InvalidRequestError):
 """Raised by ``ForeignKey`` to indicate a reference cannot be resolved."""
 
 
 class NoReferencedTableError(NoReferenceError):
 """Raised by ``ForeignKey`` when the referred ``Table`` cannot be
 located.
 
 """
 def __init__(self, message, tname):
 NoReferenceError.__init__(self, message)
 self.table_name = tname
 
 def __reduce__(self):
 return self.__class__, (self.args[0], self.table_name)
 
 
 class NoReferencedColumnError(NoReferenceError):
 """Raised by ``ForeignKey`` when the referred ``Column`` cannot be
 located.
 
 """
 def __init__(self, message, tname, cname):
 NoReferenceError.__init__(self, message)
 self.table_name = tname
 self.column_name = cname
 
 def __reduce__(self):
 return self.__class__, (self.args[0], self.table_name,
 self.column_name)
 
 
 class NoSuchTableError(InvalidRequestError):
 """Table does not exist or is not visible to a connection."""
 
 
 class UnboundExecutionError(InvalidRequestError):
 """SQL was attempted without a database connection to execute it on."""
 
 
 class DontWrapMixin(object):
 """A mixin class which, when applied to a user-defined Exception class,
 will not be wrapped inside of :exc:`.StatementError` if the error is
 emitted within the process of executing a statement.
 
 E.g.::
 
 from sqlalchemy.exc import DontWrapMixin
 
 class MyCustomException(Exception, DontWrapMixin):
 pass
 
 class MySpecialType(TypeDecorator):
 impl = String
 
 def process_bind_param(self, value, dialect):
 if value == 'invalid':
 raise MyCustomException("invalid!")
 
 """
 
 # Moved to orm.exc; compatibility definition installed by orm import until 0.6
 UnmappedColumnError = None
 
 
 class StatementError(SQLAlchemyError):
 """An error occurred during execution of a SQL statement.
 
 :class:`StatementError` wraps the exception raised
 during execution, and features :attr:`.statement`
 and :attr:`.params` attributes which supply context regarding
 the specifics of the statement which had an issue.
 
 The wrapped exception object is available in
 the :attr:`.orig` attribute.
 
 """
 
 statement = None
 """The string SQL statement being invoked when this exception occurred."""
 
 params = None
 """The parameter list being used when this exception occurred."""
 
 orig = None
 """The DBAPI exception object."""
 
 def __init__(self, message, statement, params, orig):
 SQLAlchemyError.__init__(self, message)
 self.statement = statement
 self.params = params
 self.orig = orig
 self.detail = []
 
 def add_detail(self, msg):
 self.detail.append(msg)
 
 def __reduce__(self):
 return self.__class__, (self.args[0], self.statement,
 self.params, self.orig)
 
 def __str__(self):
 from sqlalchemy.sql import util
 
 details = [SQLAlchemyError.__str__(self)]
 if self.statement:
 details.append("[SQL: %r]" % self.statement)
 if self.params:
 params_repr = util._repr_params(self.params, 10)
 details.append("[parameters: %r]" % params_repr)
 return ' '.join([
 "(%s)" % det for det in self.detail
 ] + details)
 
 def __unicode__(self):
 return self.__str__()
 
 
 class DBAPIError(StatementError):
 """Raised when the execution of a database operation fails.
 
 Wraps exceptions raised by the DB-API underlying the
 database operation.  Driver-specific implementations of the standard
 DB-API exception types are wrapped by matching sub-types of SQLAlchemy's
 :class:`DBAPIError` when possible.  DB-API's ``Error`` type maps to
 :class:`DBAPIError` in SQLAlchemy, otherwise the names are identical.  Note
 that there is no guarantee that different DB-API implementations will
 raise the same exception type for any given error condition.
 
 :class:`DBAPIError` features :attr:`~.StatementError.statement`
 and :attr:`~.StatementError.params` attributes which supply context
 regarding the specifics of the statement which had an issue, for the
 typical case when the error was raised within the context of
 emitting a SQL statement.
 
 The wrapped exception object is available in the
 :attr:`~.StatementError.orig` attribute. Its type and properties are
 DB-API implementation specific.
 
 """
 
 @classmethod
 def instance(cls, statement, params,
 orig, dbapi_base_err,
 connection_invalidated=False,
 dialect=None):
 # Don't ever wrap these, just return them directly as if
 # DBAPIError didn't exist.
 if (isinstance(orig, BaseException) and
 not isinstance(orig, Exception)) or \
 isinstance(orig, DontWrapMixin):
 return orig
 
 if orig is not None:
 # not a DBAPI error, statement is present.
 # raise a StatementError
 if not isinstance(orig, dbapi_base_err) and statement:
 return StatementError(
 "(%s.%s) %s" %
 (orig.__class__.__module__, orig.__class__.__name__,
 orig),
 statement, params, orig
 )
 
 glob = globals()
 for super_ in orig.__class__.__mro__:
 name = super_.__name__
 if dialect:
 name = dialect.dbapi_exception_translation_map.get(
 name, name)
 if name in glob and issubclass(glob[name], DBAPIError):
 cls = glob[name]
 break
 
 return cls(statement, params, orig, connection_invalidated)
 
 def __reduce__(self):
 return self.__class__, (self.statement, self.params,
 self.orig, self.connection_invalidated)
 
 def __init__(self, statement, params, orig, connection_invalidated=False):
 try:
 text = str(orig)
 except Exception as e:
 text = 'Error in str() of DB-API-generated exception: ' + str(e)
 StatementError.__init__(
 self,
 '(%s.%s) %s' % (
 orig.__class__.__module__, orig.__class__.__name__, text, ),
 statement,
 params,
 orig
 )
 self.connection_invalidated = connection_invalidated
 
 
 class InterfaceError(DBAPIError):
 """Wraps a DB-API InterfaceError."""
 
 
 class DatabaseError(DBAPIError):
 """Wraps a DB-API DatabaseError."""
 
 
 class DataError(DatabaseError):
 """Wraps a DB-API DataError."""
 
 
 class OperationalError(DatabaseError):
 """Wraps a DB-API OperationalError."""
 
 
 class IntegrityError(DatabaseError):
 """Wraps a DB-API IntegrityError."""
 
 
 class InternalError(DatabaseError):
 """Wraps a DB-API InternalError."""
 
 
 class ProgrammingError(DatabaseError):
 """Wraps a DB-API ProgrammingError."""
 
 
 class NotSupportedError(DatabaseError):
 """Wraps a DB-API NotSupportedError."""
 
 
 # Warnings
 
 class SADeprecationWarning(DeprecationWarning):
 """Issued once per usage of a deprecated API."""
 
 
 class SAPendingDeprecationWarning(PendingDeprecationWarning):
 """Issued once per usage of a deprecated API."""
 
 
 class SAWarning(RuntimeWarning):
 """Issued at runtime."""
 
 |