summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/engine')
-rw-r--r--lib/sqlalchemy/engine/base.py31
-rw-r--r--lib/sqlalchemy/engine/result.py70
-rw-r--r--lib/sqlalchemy/engine/row.py6
3 files changed, 64 insertions, 43 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index ce6c2e9c6..449f386ce 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -996,8 +996,10 @@ class Connection(Connectable):
return self._execute_text(object_, multiparams, params)
try:
meth = object_._execute_on_connection
- except AttributeError:
- raise exc.ObjectNotExecutableError(object_)
+ except AttributeError as err:
+ util.raise_(
+ exc.ObjectNotExecutableError(object_), replace_context=err
+ )
else:
return meth(self, multiparams, params)
@@ -1400,7 +1402,7 @@ class Connection(Connectable):
invalidate_pool_on_disconnect = not is_exit_exception
if self._reentrant_error:
- util.raise_from_cause(
+ util.raise_(
exc.DBAPIError.instance(
statement,
parameters,
@@ -1412,7 +1414,8 @@ class Connection(Connectable):
if context is not None
else None,
),
- exc_info,
+ with_traceback=exc_info[2],
+ from_=e,
)
self._reentrant_error = True
try:
@@ -1502,11 +1505,13 @@ class Connection(Connectable):
self._autorollback()
if newraise:
- util.raise_from_cause(newraise, exc_info)
+ util.raise_(newraise, with_traceback=exc_info[2], from_=e)
elif should_wrap:
- util.raise_from_cause(sqlalchemy_exception, exc_info)
+ util.raise_(
+ sqlalchemy_exception, with_traceback=exc_info[2], from_=e
+ )
else:
- util.reraise(*exc_info)
+ util.raise_(exc_info[1], with_traceback=exc_info[2])
finally:
del self._reentrant_error
@@ -1573,11 +1578,13 @@ class Connection(Connectable):
) = ctx.is_disconnect
if newraise:
- util.raise_from_cause(newraise, exc_info)
+ util.raise_(newraise, with_traceback=exc_info[2], from_=e)
elif should_wrap:
- util.raise_from_cause(sqlalchemy_exception, exc_info)
+ util.raise_(
+ sqlalchemy_exception, with_traceback=exc_info[2], from_=e
+ )
else:
- util.reraise(*exc_info)
+ util.raise_(exc_info[1], with_traceback=exc_info[2])
def _run_ddl_visitor(self, visitorcallable, element, **kwargs):
"""run a DDL visitor.
@@ -2329,7 +2336,9 @@ class Engine(Connectable, log.Identified):
e, dialect, self
)
else:
- util.reraise(*sys.exc_info())
+ util.raise_(
+ sys.exc_info()[1], with_traceback=sys.exc_info()[2]
+ )
def raw_connection(self, _connection=None):
"""Return a "raw" DBAPI connection from the connection pool.
diff --git a/lib/sqlalchemy/engine/result.py b/lib/sqlalchemy/engine/result.py
index 1a63c307b..7db9eecae 100644
--- a/lib/sqlalchemy/engine/result.py
+++ b/lib/sqlalchemy/engine/result.py
@@ -53,11 +53,11 @@ class ResultMetaData(object):
def _has_key(self, key):
return key in self._keymap
- def _key_fallback(self, key):
+ def _key_fallback(self, key, err):
if isinstance(key, int):
- raise IndexError(key)
+ util.raise_(IndexError(key), replace_context=err)
else:
- raise KeyError(key)
+ util.raise_(KeyError(key), replace_context=err)
class SimpleResultMetaData(ResultMetaData):
@@ -546,11 +546,14 @@ class CursorResultMetaData(ResultMetaData):
) in self._colnames_from_description(context, cursor_description):
yield idx, colname, sqltypes.NULLTYPE, coltype, None, untranslated
- def _key_fallback(self, key, raiseerr=True):
+ def _key_fallback(self, key, err, raiseerr=True):
if raiseerr:
- raise exc.NoSuchColumnError(
- "Could not locate column in row for column '%s'"
- % util.string_or_unprintable(key)
+ util.raise_(
+ exc.NoSuchColumnError(
+ "Could not locate column in row for column '%s'"
+ % util.string_or_unprintable(key)
+ ),
+ replace_context=err,
)
else:
return None
@@ -570,8 +573,8 @@ class CursorResultMetaData(ResultMetaData):
def _getter(self, key, raiseerr=True):
try:
rec = self._keymap[key]
- except KeyError:
- rec = self._key_fallback(key, raiseerr)
+ except KeyError as ke:
+ rec = self._key_fallback(key, ke, raiseerr)
if rec is None:
return None
@@ -598,8 +601,8 @@ class CursorResultMetaData(ResultMetaData):
for key in keys:
try:
rec = self._keymap[key]
- except KeyError:
- rec = self._key_fallback(key, raiseerr)
+ except KeyError as ke:
+ rec = self._key_fallback(key, ke, raiseerr)
if rec is None:
return None
@@ -656,9 +659,9 @@ class LegacyCursorResultMetaData(CursorResultMetaData):
)
return True
else:
- return self._key_fallback(key, False) is not None
+ return self._key_fallback(key, None, False) is not None
- def _key_fallback(self, key, raiseerr=True):
+ def _key_fallback(self, key, err, raiseerr=True):
map_ = self._keymap
result = None
@@ -714,9 +717,12 @@ class LegacyCursorResultMetaData(CursorResultMetaData):
)
if result is None:
if raiseerr:
- raise exc.NoSuchColumnError(
- "Could not locate column in row for column '%s'"
- % util.string_or_unprintable(key)
+ util.raise_(
+ exc.NoSuchColumnError(
+ "Could not locate column in row for column '%s'"
+ % util.string_or_unprintable(key)
+ ),
+ replace_context=err,
)
else:
return None
@@ -736,7 +742,7 @@ class LegacyCursorResultMetaData(CursorResultMetaData):
if key in self._keymap:
return True
else:
- return self._key_fallback(key, False) is not None
+ return self._key_fallback(key, None, False) is not None
class CursorFetchStrategy(object):
@@ -807,9 +813,12 @@ class NoCursorDQLFetchStrategy(CursorFetchStrategy):
def fetchall(self):
return self._non_result([])
- def _non_result(self, default):
+ def _non_result(self, default, err=None):
if self.closed:
- raise exc.ResourceClosedError("This result object is closed.")
+ util.raise_(
+ exc.ResourceClosedError("This result object is closed."),
+ replace_context=err,
+ )
else:
return default
@@ -843,10 +852,13 @@ class NoCursorDMLFetchStrategy(CursorFetchStrategy):
def fetchall(self):
return self._non_result([])
- def _non_result(self, default):
- raise exc.ResourceClosedError(
- "This result object does not return rows. "
- "It has been closed automatically."
+ def _non_result(self, default, err=None):
+ util.raise_(
+ exc.ResourceClosedError(
+ "This result object does not return rows. "
+ "It has been closed automatically."
+ ),
+ replace_context=err,
)
@@ -1123,24 +1135,24 @@ class BaseResult(object):
def _getter(self, key, raiseerr=True):
try:
getter = self._metadata._getter
- except AttributeError:
- return self.cursor_strategy._non_result(None)
+ except AttributeError as err:
+ return self.cursor_strategy._non_result(None, err)
else:
return getter(key, raiseerr)
def _tuple_getter(self, key, raiseerr=True):
try:
getter = self._metadata._tuple_getter
- except AttributeError:
- return self.cursor_strategy._non_result(None)
+ except AttributeError as err:
+ return self.cursor_strategy._non_result(None, err)
else:
return getter(key, raiseerr)
def _has_key(self, key):
try:
has_key = self._metadata._has_key
- except AttributeError:
- return self.cursor_strategy._non_result(None)
+ except AttributeError as err:
+ return self.cursor_strategy._non_result(None, err)
else:
return has_key(key)
diff --git a/lib/sqlalchemy/engine/row.py b/lib/sqlalchemy/engine/row.py
index 55d8c2249..b58b350e2 100644
--- a/lib/sqlalchemy/engine/row.py
+++ b/lib/sqlalchemy/engine/row.py
@@ -84,8 +84,8 @@ except ImportError:
def _subscript_impl(self, key, ismapping):
try:
rec = self._keymap[key]
- except KeyError:
- rec = self._parent._key_fallback(key)
+ except KeyError as ke:
+ rec = self._parent._key_fallback(key, ke)
except TypeError:
# the non-C version detects a slice using TypeError.
# this is pretty inefficient for the slice use case
@@ -119,7 +119,7 @@ except ImportError:
try:
return self._get_by_key_impl_mapping(name)
except KeyError as e:
- raise AttributeError(e.args[0])
+ util.raise_(AttributeError(e.args[0]), replace_context=e)
class Row(BaseRow, collections_abc.Sequence):