summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2018-04-06 11:39:15 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2018-04-09 09:15:52 -0400
commit036cdbe7fb2d651ba5fbbc758c8584df011c8043 (patch)
tree651aa5734525e5784a0f879b7752cbfd45fa4922 /lib/sqlalchemy
parent5abeee69e34d45796cdff0770f58f9104da74701 (diff)
downloadsqlalchemy-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')
-rw-r--r--lib/sqlalchemy/orm/persistence.py8
-rw-r--r--lib/sqlalchemy/sql/sqltypes.py1
2 files changed, 7 insertions, 2 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):
diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py
index c02ece98a..573fda98f 100644
--- a/lib/sqlalchemy/sql/sqltypes.py
+++ b/lib/sqlalchemy/sql/sqltypes.py
@@ -1175,7 +1175,6 @@ class Enum(Emulated, String, SchemaType):
two = 2
three = 3
-
t = Table(
'data', MetaData(),
Column('value', Enum(MyEnum))