[Sqlalchemy-tickets] Issue #4285: session attempted to sort enum.Enum (zzzeek/sqlalchemy)
Brought to you by:
zzzeek
From: moon c. <iss...@bi...> - 2018-06-24 00:31:04
|
New issue 4285: session attempted to sort enum.Enum https://bitbucket.org/zzzeek/sqlalchemy/issues/4285/session-attempted-to-sort-enumenum moon cake: It seems like `_sort_states` in `persistence.py` is trying to sort the primary key(s), irregardless whether it is sortable. In this case, I'm using an `enum.Enum`. Full repro code follows. ``` (sqlalchemy) $ python test.py Traceback (most recent call last): File "test.py", line 35, in <module> create_trees(session) File "test.py", line 29, in create_trees session.query(Tree).merge_result([Tree(color=Color.red), Tree(color=Color.black)]) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 572, in __exit__ self.rollback() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 569, in __exit__ self.commit() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 467, in commit self._prepare_impl() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 447, in _prepare_impl self.session.flush() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2254, in flush self._flush(objects) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2380, in _flush transaction.rollback(_capture_exception=True) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/langhelpers.py", line 66, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 2344, in _flush flush_context.execute() File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 391, in execute rec.execute(self) File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/unitofwork.py", line 556, in execute uow File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 156, in save_obj base_mapper, states, uowtransaction File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 286, in _organize_states_for_save states): File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1255, in _connections_for_states for state in _sort_states(states): File "/tmp/sqlalchemy/lib/python3.6/site-packages/sqlalchemy/orm/persistence.py", line 1277, in _sort_states sorted(persistent, key=lambda q: q.key[1]) TypeError: '<' not supported between instances of 'Color' and 'Color' ``` ======= Repro code ```py import enum from sqlalchemy import create_engine, Column, Enum from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base class Color(enum.Enum): red = 'Red' black = 'Black' Base = declarative_base() class Tree(Base): __tablename__ = 'tree' color = Column(Enum(Color), primary_key=True) engine = create_engine('postgresql://tree:tree@127.0.0.1/trees') Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) def create_trees(session): with session.begin_nested(): session.query(Tree).merge_result([Tree(color=Color.red), Tree(color=Color.black)]) session.commit() session = Session() create_trees(session) create_trees(session) ``` |