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 sqlalchemy+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/3e863503-4afa-44c3-b54a-4fb26ae5e8c8n%40googlegroups.com.

Reply via email to