Yuuup... It works like a charm! I have created a simple class that gets a dictionary and "serializes" its values. The underlying database is MySql...
Just in case my code may help someone (or if someone has any suggestions...) here it goes: from sqlalchemy import types import logging log = logging.getLogger(__name__) class SimpleDict(types.TypeDecorator): impl = types.String size = -1 __separatorChar = chr(0x1D) __boolPrefix = "b_" __intPrefix = "i_" __floatPrefix = "f_" __nullPrefix = "n_" __specialPrefixes = set([__boolPrefix, __intPrefix, __floatPrefix, __nullPrefix]) __nullValues = set(["null", "None"]) def __init__(self, length = 1024): self.size = int(length) super(ZepSimpleDict, self).__init__(self.size) def __toString(self, value): retval = None if isinstance(value, bool): retval = self.__boolPrefix + str(value) elif isinstance(value, float): retval = self.__floatPrefix + str(value) elif isinstance(value, int): retval = self.__intPrefix + str(value) elif (value is None) or (value in self.__nullValues): retval = self.__nullPrefix + str(None) else: retval = str(value) return retval def __fromString(self, value): retval = None prefix = None actualValue = None if len(value) > 2: prefix = value[0:2] if (prefix in self.__specialPrefixes): actualValue = value[2:] if prefix == self.__boolPrefix: if actualValue == "True": retval = True elif actualValue == "False": retval = False else: retval = value elif prefix == self.__floatPrefix: try: retval = float(actualValue) except ValueError: retval = value elif prefix == self.__intPrefix: try: retval = int(actualValue) except ValueError: retval = value elif prefix == self.__nullPrefix: if actualValue == str(None): retval = None else: retval = value else: retval = value else: retval = value return retval def process_bind_param(self, value, dialect): value_tmp = None flattenedValue = list() retval = None if isinstance(value, dict): value_tmp = dict() for key, val in value.iteritems(): value_tmp[self.__toString(key)] = self.__toString(val) else: value_tmp = None if (value_tmp is not None): for key, val in value_tmp.iteritems(): flattenedValue.append(key) flattenedValue.append(val) retval = self.__separatorChar.join(flattenedValue) else: retval = None return retval def process_result_value(self, value, dialect): retval = dict() value_tmp = value.split(self.__separatorChar) if (len(value_tmp) > 0): if (len(value_tmp) % 2 != 0): log.warn("process_result_value > Processing an string with odd number of elements. This should not have happened.") for i in range(0, len(value_tmp), 2): retval[self.__fromString(value_tmp[i])] = self.__fromString(value_tmp[i+1]) return retval In my previous message, I said: *In my brain, I have "dreamed" about something like an special type of sqlalchemy.Column in which you can specify something like "on_save = execute this()" and "on_load = execute that()"... * This does exactly that! :) -- 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.