On Aug 9, 3:38 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:

> its pulling off the "types.Enum" callable from self.__class__ (which actually 
> seems unnecessary here, self.impl should be fine), then calling that with the 
> given arguments.  So it should be setting up the native_enum=False part at 
> least.   The length attribute though would need to be set on impl.        
> There's no reason we can't make "length" an actual argument of Enum, though, 
> just to help with this kind of thing (I'm assuming that you're planning on 
> adding additional elements to the enum in the future and you don't want to 
> have to alter the column, correct ?).

Correct. About the self.length thing, I simply misread __getattr__ on
TypeDecorator as __setattr__. I've included my test below just for
completness' sake to show that everything works as expected.

from sqlalchemy import create_engine, Column, types
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base(bind=engine)
Session = scoped_session(sessionmaker(bind=engine))

class StringEnum(types.TypeDecorator):
    impl = types.Enum

    def __init__(self, *args, **kwargs):
        super(StringEnum, self).__init__(*args, native_enum=False,
**kwargs)
        self.impl.length = 255

class Item(Base):
    __tablename__ = 'items'
    name = Column(types.String, primary_key=True)
    option = Column(StringEnum(('foo', 'bar')), nullable=True)

Base.metadata.create_all()

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to