hello friends, i'm trying to use a custom type, as illustrated in http://www.sqlalchemy.org/docs/05/types.html, but neither the old convert_bind_param and convert_result_value, nor the newer process_bind_param and process_result_value to not appear to be invoked when i manipulate the type.
the original code was working for me, in the old method. it was downloaded from: http://www.mail-archive.com/[EMAIL PROTECTED]/msg00299.html. the code and test are attached. best regards, alex --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
############# """enum.py""" from sqlalchemy.types import TypeDecorator, String, Unicode class Enum(TypeDecorator): """This class adds support for ENUM fields, similar in functionality to the ENUM column type in MySQL""" def __init__(self, values, empty_to_none=False): ''' contruct an Enum type values : a list of values that are valid for this column empty_to_none : treat the empty string '' as None ''' if values is None or len(values) is 0: raise exceptions.AssertionError('Enum requires a list of values') self.empty_to_none = empty_to_none self.values = values # the length of the string/unicode column should be the longest string # in values size = max([len(v) for v in values if v is not None]) super(Enum, self).__init__(size) def test_range(self, value): if value not in self.values: raise AssertionError('"%s" not in Enum.values' % value) return value # def convert_bind_param(self, value, engine): # if self.empty_to_none and value is '': # value = None # self.test_range(value) # return super(Enum, self).convert_bind_param(value, engine) # # # def convert_result_value(self, value, engine): # self.test_range(value) # return super(Enum, self).convert_result_value(value, engine) # def process_bind_param(self, value, dialect): print 'bind' return self.test_range(value) def process_result_value(self, value, dialect): print 'result' return self.test_range(value) def copy(self): return Enum(self.values, self.empty_to_none) class EnumUnicode(Enum): impl = Unicode class EnumString(Enum): impl = String
############# """test_enum.py""" from sqlalchemy import create_engine from enum import * from elixir import * #engine = create_engine('sqlite:///') #metadata.connect(engine) metadata.bind = 'sqlite:///' metadata.bind.echo = True def test_enum(): class TestPerson(Entity): gender = Field(EnumString(["m","f"])) create_all() t = TestPerson() t.gender = "m" session.flush() t.gender = "f" session.flush() t.gender = "W" #this should fail # session.flush() try: session.flush() except AssertionError: print "'W' failed" pass else: print "success with W" assert False #make sure this fails if it doesn't raise the exception above drop_all() session.clear()