typedecorator of typedecorator

Issue #3278 resolved
Mike Bayer repo owner created an issue
from sqlalchemy import types as sa_types, Column


class BigText(sa_types.TypeDecorator):
    impl = sa_types.Text


class BigJSONEncodedDict(sa_types.TypeDecorator):
    impl = BigText


c1 = Column('foo', BigJSONEncodedDict())

print(c1 == {'x': 'y'})
#!


Traceback (most recent call last):
  File "test.py", line 14, in <module>
    print(c1 == {'x': 'y'})
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/operators.py", line 298, in __eq__
    return self.operate(eq, other)
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/elements.py", line 732, in operate
    return op(self.comparator, *other, **kwargs)
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/util/langhelpers.py", line 729, in __get__
    obj.__dict__[self.__name__] = result = self.fget(obj)
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/elements.py", line 718, in comparator
    return self.type.comparator_factory(self)
  File "/Users/classic/dev/sqlalchemy/lib/sqlalchemy/sql/type_api.py", line 635, in comparator_factory
    {})
TypeError: Cannot create a consistent method resolution
order (MRO) for bases Comparator, TDComparator

Comments (3)

  1. Mike Bayer reporter

    workaround:

    from sqlalchemy import types as sa_types, Column
    
    
    class PatchFor3278TypeDecorator(sa_types.TypeDecorator):
        """Workaround for:
    
        https://bitbucket.org/zzzeek/sqlalchemy/issue/3278/typedecorator-of-typedecorator
    
        """
        @property
        def comparator_factory(self):
            if sa_types.TypeDecorator.Comparator in \
                    self.impl.comparator_factory.__mro__:
                return self.impl.comparator_factory
            else:
                return super(PatchFor3278TypeDecorator, self).comparator_factory
    TypeDecorator = PatchFor3278TypeDecorator
    
    
    class BigText(TypeDecorator):
        impl = sa_types.Text
    
    
    class BigJSONEncodedDict(TypeDecorator):
        impl = BigText
    
    
    c1 = Column('foo', BigJSONEncodedDict())
    
    print(c1 == {'x': 'y'})
    
  2. Log in to comment