Skip to content

Commit 67814a9

Browse files
committed
Add original error to dbapi exceptions
1 parent 4170e5f commit 67814a9

File tree

4 files changed

+29
-16
lines changed

4 files changed

+29
-16
lines changed

ydb_sqlalchemy/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from .dbapi import IsolationLevel # noqa: F401
2+
from .sqlalchemy import Upsert, types, upsert # noqa: F401

ydb_sqlalchemy/dbapi/connection.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ def _create_driver(self):
162162
try:
163163
self._maybe_await(driver.wait, timeout=5, fail_fast=True)
164164
except ydb.Error as e:
165-
raise InterfaceError(e.message, e.issues, e.status) from e
165+
raise InterfaceError(e.message, original_error=e) from e
166166
except Exception as e:
167167
self._maybe_await(driver.stop)
168168
raise InterfaceError(f"Failed to connect to YDB, details {driver.discovery_debug_details()}") from e

ydb_sqlalchemy/dbapi/cursor.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ def wrapper(*args, **kwargs):
4141
try:
4242
return func(*args, **kwargs)
4343
except (ydb.issues.AlreadyExists, ydb.issues.PreconditionFailed) as e:
44-
raise IntegrityError(e.message, e.issues, e.status) from e
44+
raise IntegrityError(e.message, original_error=e) from e
4545
except (ydb.issues.Unsupported, ydb.issues.Unimplemented) as e:
46-
raise NotSupportedError(e.message, e.issues, e.status) from e
46+
raise NotSupportedError(e.message, original_error=e) from e
4747
except (ydb.issues.BadRequest, ydb.issues.SchemeError) as e:
48-
raise ProgrammingError(e.message, e.issues, e.status) from e
48+
raise ProgrammingError(e.message, original_error=e) from e
4949
except (
5050
ydb.issues.TruncatedResponseError,
5151
ydb.issues.ConnectionError,
@@ -59,13 +59,13 @@ def wrapper(*args, **kwargs):
5959
ydb.issues.SessionExpired,
6060
ydb.issues.SessionPoolEmpty,
6161
) as e:
62-
raise OperationalError(e.message, e.issues, e.status) from e
62+
raise OperationalError(e.message, original_error=e) from e
6363
except ydb.issues.GenericError as e:
64-
raise DataError(e.message, e.issues, e.status) from e
64+
raise DataError(e.message, original_error=e) from e
6565
except ydb.issues.InternalError as e:
66-
raise InternalError(e.message, e.issues, e.status) from e
66+
raise InternalError(e.message, original_error=e) from e
6767
except ydb.Error as e:
68-
raise DatabaseError(e.message, e.issues, e.status) from e
68+
raise DatabaseError(e.message, original_error=e) from e
6969
except Exception as e:
7070
raise DatabaseError("Failed to execute query") from e
7171

@@ -214,7 +214,7 @@ def _rows_iterable(self, chunks_iterable: ydb.convert.ResultSets):
214214
# of this PEP to return a sequence: https://www.python.org/dev/peps/pep-0249/#fetchmany
215215
yield row[::]
216216
except ydb.Error as e:
217-
raise DatabaseError(e.message, e.issues, e.status) from e
217+
raise DatabaseError(e.message, original_error=e) from e
218218

219219
def _ensure_prefetched(self):
220220
if self.rows is not None and self._rows_prefetched is None:

ydb_sqlalchemy/dbapi/errors.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
1+
from typing import Optional, List
2+
3+
import ydb
4+
from google.protobuf.message import Message
5+
6+
17
class Warning(Exception):
28
pass
39

410

511
class Error(Exception):
6-
def __init__(self, message, issues=None, status=None):
12+
def __init__(
13+
self,
14+
message: str,
15+
original_error: Optional[ydb.Error] = None,
16+
):
717
super(Error, self).__init__(message)
818

9-
pretty_issues = _pretty_issues(issues)
10-
self.issues = issues
11-
self.message = pretty_issues or message
12-
self.status = status
19+
self.original_error = original_error
20+
if original_error:
21+
pretty_issues = _pretty_issues(original_error.issues)
22+
self.issues = original_error.issues
23+
self.message = pretty_issues or message
24+
self.status = original_error.status
1325

1426

1527
class InterfaceError(Error):
@@ -44,7 +56,7 @@ class NotSupportedError(DatabaseError):
4456
pass
4557

4658

47-
def _pretty_issues(issues):
59+
def _pretty_issues(issues: List[Message]) -> str:
4860
if issues is None:
4961
return None
5062

@@ -56,7 +68,7 @@ def _pretty_issues(issues):
5668
return "\n" + "\n".join(children_messages)
5769

5870

59-
def _get_messages(issue, max_depth=100, indent=2, depth=0, root=False):
71+
def _get_messages(issue: Message, max_depth: int = 100, indent: int = 2, depth: int = 0, root: bool = False) -> str:
6072
if depth >= max_depth:
6173
return None
6274

0 commit comments

Comments
 (0)