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.

Reply via email to