Yep, you're right... That's exactly what's happening. The set event is, indeed self._values = []
The issue is that I can't upgrade to SqlAlchemy 0.7... Anyway... thank you for the help... I'll have to look for a workaround... 2012/7/9 Michael Bayer <mike...@zzzcomputing.com>: > > On Jul 9, 2012, at 12:38 PM, Hector Blanco wrote: > >> Hello everyone. >> >> I have a class that uses a "custom" column to store a list of strings. >> The column is saved in the database using a comma sepparated string. >> When it's loaded into an instance, it "becomes" a list: >> >> class Keyword(declarativeBase): >> __tablename__ = "keywords" >> _id = Column("id", Integer, primary_key=True) >> _values = column_property(Column("values", >> CharSeparatedStrings.CharSeparatedStrings()), >> extension=ValuesAttributeExtension.ValuesAttributeExtension(), >> active_history=True) >> >> I want to use an extension to check the items that have been >> deleted/modified in that list. That's why I'm wrapping the Column in a >> column_property. > > you've already got a custom type there, so unless you want an immediate > exception raise or something, this would be easier just to keep it in terms > of the column type, like a TypeDecorator around String that deals with sets > on the Python side. > >> >> When I put a bunch of checkpoints in the "ValueAttributeExtension", >> the value that is going to be set is always an empty list. The >> oldvalue works fine, though: >> >> class ValuesAttributeExtension(AttributeExtension): >> def append(self, state, value, initiator): >> print("%s::append > Checkpoint!. Value: %s, state.obj()::%s" % >> (self.__class__.__name__, value, state.obj())) >> return value >> def remove(self, state, value, initiator): >> print("%s::append > Checkpoint!. Value: %s, state.obj()::%s" % >> (self.__class__.__name__, value, state.obj())) >> return value >> def set(self, state, value, oldValue, initiator): >> print("%s::set > Checkpoint!. Value: %s, oldValue: %s, >> state.obj().values: %s" % (self.__class__.__name__, value, oldValue, >> state.obj().values)) >> return value >> >> Let's say the initial (old) value was ["yes"] and I add a "no". I >> would expect the "value" parameter in the set method to be ["yes", >> "no"] and the oldValue to be ["yes"] but this is what I get: > > what is "adding" here ? > > like keyword.values.append(x) ? > > assuming "values" is a descriptor that just says, "self._values = []; return > self._values", that "self._values = []" is your set event. What you do with > the list subsequent to that is outside of SQLAlchemy's purview, that list > isn't instrumented. > > you'd get the event if you said : keyword._values = ["yes"]. that's a "set" > event. the append and remove events aren't relevant here since this is not > an instrumented collection (its a column, not a relationship). > > if you're really looking for the list here, set as a scalar from a mapping > perspective, to emit events as things happen to it, that's the use case for > the mutable extension: > http://docs.sqlalchemy.org/en/rel_0_7/orm/extensions/mutable.html . > > if you are in fact on 0.7, I'd look to upgrade from AttributeExtension to the > event package as well. > > > > -- > 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 > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- 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 sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.