Michael Hipp wrote:
> On 8/24/2010 1:51 PM, Michael Bayer wrote:
>>
>> On Aug 24, 2010, at 2:08 PM, Michael Hipp wrote:
>>
>>> I'm holding an orm object that will have changes made to it. Once done
>>> it will be passed to the business logic layer that will have to make
>>> decisions from the before and after state of the object...
>>>
>>> What's the best way to get an object, save its state ('before'), modify
>>> it ('after) without any chance of the modifications creeping into the
>>> before? Assume both copies are from the same session.
>>
>> You'd probably call session.flush() (or commit(), depending on how you
>> are scoping your transaction around this operation) before you do
>> anything to it.   Then, if you'd like the subsequent modifications to
>> not go to the database at all until some later point, you'd proceed with
>> your subsequent operations with autoflush turned off - recipes for that
>> are at http://www.sqlalchemy.org/trac/wiki/UsageRecipes/DisableAutoflush
>> .
>
> Thank you. But I didn't understand any of that ... at least as it
> relates to my question.
>
> How do I make a copy of an orm object such that modifications to the
> copy do not affect the original?

I'm sorry for misunderstanding, but if you read your original question
you'll note that you used the word "copies" exactly once and not in any
way that made much sense - the main noun was "an orm object", singular,
and the next paragraph referred again to "an object" and "it".

The mapped object has a member "_sa_instance_state" that you basically
don't want to transfer to your new object.    You want it to have its own
"_sa_instance_state" and this comes from calling the plain constructor,
which the "copy" module, if that's what you're using, does not use.   You
also want to set attributes normally, not populating __dict__ directly.  
So just basically don't use the "copy" module.

Just construct a new object.

    x = MyObject(foo=myoldobject.foo, bar=myoldobject.bar).

or

    x = MyObject()
    for a in dir(myoldobject):
        if not a.startswith('_'):
            setattr(x, a, getattr(myoldobject, a))

> Could you perhaps repeat the answer in baby-talk language?

Babies don't know how to program computers in the first place, so I'd aim
higher than 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.

Reply via email to