diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-04-06 11:39:15 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2018-04-09 09:15:52 -0400 |
| commit | 036cdbe7fb2d651ba5fbbc758c8584df011c8043 (patch) | |
| tree | 651aa5734525e5784a0f879b7752cbfd45fa4922 /lib/sqlalchemy/orm | |
| parent | 5abeee69e34d45796cdff0770f58f9104da74701 (diff) | |
| download | sqlalchemy-036cdbe7fb2d651ba5fbbc758c8584df011c8043.tar.gz | |
Raise informative exception for non-sortable PK
An informative exception is re-raised when a primary key value is not
sortable in Python during an ORM flush under Python 3, such as an ``Enum``
that has no ``__lt__()`` method; normally Python 3 raises a ``TypeError``
in this case. The flush process sorts persistent objects by primary key
in Python so the values must be sortable.
Change-Id: Ia186968982dcd1234b82f2e701fefa2a1668a7e4
Fixes: #4232
Diffstat (limited to 'lib/sqlalchemy/orm')
| -rw-r--r-- | lib/sqlalchemy/orm/persistence.py | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index 4f1e08afa..a48bf9bf7 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -1273,8 +1273,14 @@ def _sort_states(states): pending = set(states) persistent = set(s for s in pending if s.key is not None) pending.difference_update(persistent) + try: + persistent_sorted = sorted(persistent, key=lambda q: q.key[1]) + except TypeError as err: + raise sa_exc.InvalidRequestError( + "Could not sort objects by primary key; primary key " + "values must be sortable in Python (was: %s)" % err) return sorted(pending, key=operator.attrgetter("insert_order")) + \ - sorted(persistent, key=lambda q: q.key[1]) + persistent_sorted class BulkUD(object): |
