Skip to content
This repository was archived by the owner on Jun 8, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions google/cloud/spanner_dbapi/cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,11 @@ def execute(self, sql, args=None):
self._do_execute_update, sql, args or None
)
except (AlreadyExists, FailedPrecondition, OutOfRange) as e:
raise IntegrityError(getattr(e, "details", e))
raise IntegrityError(getattr(e, "details", e)) from e
except InvalidArgument as e:
raise ProgrammingError(getattr(e, "details", e))
raise ProgrammingError(getattr(e, "details", e)) from e
except InternalServerError as e:
raise OperationalError(getattr(e, "details", e))
raise OperationalError(getattr(e, "details", e)) from e

@check_not_closed
def executemany(self, operation, seq_of_params):
Expand Down
62 changes: 61 additions & 1 deletion google/cloud/spanner_dbapi/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

"""Spanner DB API exceptions."""

from google.api_core.exceptions import GoogleAPICallError


class Warning(Exception):
"""Important DB API warning."""
Expand All @@ -27,7 +29,65 @@ class Error(Exception):
Does not include :class:`Warning`.
"""

pass
def _is_error_cause_instance_of_google_api_exception(self):
Comment thread
IlyaFaer marked this conversation as resolved.
Resolved
return isinstance(self.__cause__, GoogleAPICallError)

@property
def reason(self):
"""The reason of the error.
Reference:
https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L112
Comment thread
gauravpurohit06 marked this conversation as resolved.
Resolved
Returns:
Union[str, None]: An optional string containing reason of the error.
"""
return (
self.__cause__.reason
if self._is_error_cause_instance_of_google_api_exception()
else None
)

@property
def domain(self):
"""The logical grouping to which the "reason" belongs.
Reference:
https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L112
Returns:
Union[str, None]: An optional string containing a logical grouping to which the "reason" belongs.
"""
return (
self.__cause__.domain
if self._is_error_cause_instance_of_google_api_exception()
else None
)

@property
def metadata(self):
"""Additional structured details about this error.
Reference:
https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto#L112
Returns:
Union[Dict[str, str], None]: An optional object containing structured details about the error.
"""
return (
self.__cause__.metadata
if self._is_error_cause_instance_of_google_api_exception()
else None
)

@property
def details(self):
"""Information contained in google.rpc.status.details.
Reference:
https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
https://github.com/googleapis/googleapis/blob/master/google/rpc/error_details.proto
Returns:
Sequence[Any]: A list of structured objects from error_details.proto
"""
return (
self.__cause__.details
if self._is_error_cause_instance_of_google_api_exception()
else None
)


class InterfaceError(Error):
Expand Down