summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/engine/row.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-12-09 14:23:42 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2021-12-09 14:23:42 -0500
commitf113e979219e20a22044c4b262e4531ba9993b8a (patch)
treef0c3f868f1e7ca64ffa5518208b81945b7a723f0 /lib/sqlalchemy/engine/row.py
parentaf50c8064d668ba33ef2399a288fd1594b1b5602 (diff)
downloadsqlalchemy-f113e979219e20a22044c4b262e4531ba9993b8a.tar.gz
implement correct errors for Row immutability
Corrected the error message for the ``AttributeError`` that's raised when attempting to write to an attribute on the :class:`_result.Row` class, which is immutable. The previous message claimed the column didn't exist which is misleading. Fixes: #7432 Change-Id: If0e2cbd3f763dca6c99a18aa42252c69f1207d59
Diffstat (limited to 'lib/sqlalchemy/engine/row.py')
-rw-r--r--lib/sqlalchemy/engine/row.py37
1 files changed, 24 insertions, 13 deletions
diff --git a/lib/sqlalchemy/engine/row.py b/lib/sqlalchemy/engine/row.py
index 1a8c4e555..43ef093d6 100644
--- a/lib/sqlalchemy/engine/row.py
+++ b/lib/sqlalchemy/engine/row.py
@@ -59,21 +59,25 @@ except ImportError:
def __init__(self, parent, processors, keymap, key_style, data):
"""Row objects are constructed by CursorResult objects."""
- self._parent = parent
+ object.__setattr__(self, "_parent", parent)
if processors:
- self._data = tuple(
- [
- proc(value) if proc else value
- for proc, value in zip(processors, data)
- ]
+ object.__setattr__(
+ self,
+ "_data",
+ tuple(
+ [
+ proc(value) if proc else value
+ for proc, value in zip(processors, data)
+ ]
+ ),
)
else:
- self._data = tuple(data)
+ object.__setattr__(self, "_data", tuple(data))
- self._keymap = keymap
+ object.__setattr__(self, "_keymap", keymap)
- self._key_style = key_style
+ object.__setattr__(self, "_key_style", key_style)
def __reduce__(self):
return (
@@ -178,6 +182,12 @@ class Row(BaseRow, collections_abc.Sequence):
_default_key_style = KEY_INTEGER_ONLY
+ def __setattr__(self, name, value):
+ raise AttributeError("can't set attribute")
+
+ def __delattr__(self, name):
+ raise AttributeError("can't delete attribute")
+
@property
def _mapping(self):
"""Return a :class:`.RowMapping` for this :class:`.Row`.
@@ -233,10 +243,11 @@ class Row(BaseRow, collections_abc.Sequence):
}
def __setstate__(self, state):
- self._parent = parent = state["_parent"]
- self._data = state["_data"]
- self._keymap = parent._keymap
- self._key_style = state["_key_style"]
+ parent = state["_parent"]
+ object.__setattr__(self, "_parent", parent)
+ object.__setattr__(self, "_data", state["_data"])
+ object.__setattr__(self, "_keymap", parent._keymap)
+ object.__setattr__(self, "_key_style", state["_key_style"])
def _op(self, other, op):
return (