10.04.2013 18:06, Michael Bayer kirjoitti:
On Apr 10, 2013, at 5:10 AM, Alex Grönholm <alex.gronh...@nextday.fi
<mailto:alex.gronh...@nextday.fi>> wrote:
The following class works on 0.8.0b2 but not 0.8.0 final:
class EnumWrapper(SchemaType, TypeDecorator):
def __init__(self, cls):
kwargs = {'name': cls.__name__.lower()}
self.impl = Enum(*(obj.key for obj in cls.values), **kwargs)
self.wrapped = cls
def _set_table(self, table, column):
self.impl._set_table(table, column)
def process_bind_param(self, value, dialect):
if value is None:
return None
if isinstance(value, self.wrapped):
return value.key
elif isinstance(value, str):
if value not in self.wrapped.symbols:
raise TypeError('No such enum value in %s: %s' %
(self.wrapped.__name__, value))
return value
raise TypeError('Expected %s, got %s instead' %
(self.wrapped, type(value)))
def process_result_value(self, value, dialect):
return getattr(self.wrapped, value) if value is not None
else None
The error message ("TypeError: __init__() got an unexpected keyword
argument 'schema'") originates from types.py, line 1886.
Is inheriting from SchemaType still necessary? That is what seems to
break things on 0.8.0 final.
Line 1886 of types.py, both in 0.8.0 and in tip, is this:
t.drop(bind=bind, checkfirst=checkfirst)
so that doesn't seem like the line we're referring to.
My bad, it was line 1866: return impltype(name=self.name, ...)
Since your example lacks context, I had to modify the call to "Enum"
to use a series of string names (don't know what obj.key, cls.values
refer to). From there, I managed to get a stack trace that refers to
line 1863 of types.py.
In the documentation for TypeDecorator at
http://docs.sqlalchemy.org/en/rel_0_8/core/types.html#sqlalchemy.types.TypeDecorator,
the example includes a copy() method. There is also a copy() method
in the original Enum recipe on my blog at
http://techspot.zzzeek.org/files/2011/decl_enum.py.
If the constructor of your decorated type is not compatible with the
type you're wrapping, you need to provide copy() as well:
def copy(self):
return DeclEnumType(self.wrapped)
Yet, the error goes away once I add something like that. Strange though,
everything worked fine even without a copy() method in 0.8.0b2.
Thanks!
hope this helps !
--
You received this message because you are subscribed to a topic in the
Google Groups "sqlalchemy" group.
To unsubscribe from this topic, visit
https://groups.google.com/d/topic/sqlalchemy/LE-EIznAIT4/unsubscribe?hl=en.
To unsubscribe from this group and all its topics, send an email to
sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.
--
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 post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.