This one is baffling me. The following example throws an exception about an
unhashable type, related (I think) to the new query caching in 1.4.
However, if I change the parameter name to AltType.__init__ to ANYTHING
other than `choices`, it works fine. I can't find any reference to the name
`choices` in the sqlalchemy codebase.
So why can't I use `choices` as a parameter name here? The answer might be
related to the AnnotatedColumn in the generated expression but that's about
as far as I've gotten.
```
# sqlalchemy 1.4.x
from sqlalchemy import Column, Integer, create_engine, TypeDecorator,
Unicode
from sqlalchemy.orm import sessionmaker, as_declarative, declared_attr
class AltType(TypeDecorator):
impl = Unicode(255)
def __init__(self, choices):
self.choices = choices
super(AltType, self).__init__()
@as_declarative()
class Base(object):
@declared_attr
def __tablename__(cls):
return cls.__name__.lower()
pk = Column(Integer, primary_key=True)
class MyClass(Base):
d = Column(AltType(['a', 'list', 'here']))
if __name__ == '__main__':
e = create_engine('sqlite://', echo=True)
conn = e.connect()
Base.metadata.create_all(e)
s = sessionmaker(e)()
q = s.query(MyClass).filter(MyClass.d == 'search_str')
result = q.first() # <---- error here
print(result)
```
result:
```
Traceback (most recent call last):
File "...\scratch_78.py", line 36, in <module>
results = q.first()
File "...\\lib\site-packages\sqlalchemy\orm\query.py", line 2750, in first
return self.limit(1)._iter().first()
File "...\\lib\site-packages\sqlalchemy\orm\query.py", line 2834, in _iter
result = self.session.execute(
File "...\\lib\site-packages\sqlalchemy\orm\session.py", line 1675, in
execute
result = conn._execute_20(statement, params or {}, execution_options)
File "...\\lib\site-packages\sqlalchemy\engine\base.py", line 1521, in
_execute_20
return meth(self, args_10style, kwargs_10style, execution_options)
File "...\\lib\site-packages\sqlalchemy\sql\elements.py", line 313, in
_execute_on_connection
return connection._execute_clauseelement(
File "...\\lib\site-packages\sqlalchemy\engine\base.py", line 1382, in
_execute_clauseelement
compiled_sql, extracted_params, cache_hit = elem._compile_w_cache(
File "...\\lib\site-packages\sqlalchemy\sql\elements.py", line 531, in
_compile_w_cache
compiled_sql = compiled_cache.get(key)
File "...\\lib\site-packages\sqlalchemy\util\_collections.py", line 918,
in get
item = dict.get(self, key, default)
TypeError: unhashable type: 'list'
```
-Steven James
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/3e863503-4afa-44c3-b54a-4fb26ae5e8c8n%40googlegroups.com.