I have a subclass myTypeSA of sqlalchemy.types.TypeDecorator that defines process_bind_param and process_result_value as follows to allow persistance of myType instances to the database:
class myTypeSA(types.TypeDecorator):
""" Decorate String type to translate myType instance into String in the database"""
impl = types.String(15)
def process_bind_param(self, value, dialect):
if value is None:
return None
assert type(value) == myType
return value.as_str()
def process_result_value(self, value, dialect):
if value is None:
return None
return myType.from_str(value)
At some point in a commit, sqlalchemy seems to try to see if an object has changed, and calls TypeDecorator.compare_values which defaults to sa.String compare_values , ie TypeEngine.compare_values. This is really just x == y , which asserts in my case because x is an instance of myType and y is a sqlalchemy string : NO_VALUE .
I'm tempted to override directly TypeDecorator.compare_values to fix this issue but I wonder if I missed something and should override coerce_compared_value or process_literal_param ; the comments detailing when those methods are used are not very clear to me. How should that comparison against NO_VALUE have been handled?
Thanks