On Oct 16, 2010, at 4:02 PM, Michael Hipp wrote: > On 10/16/2010 1:55 PM, Michael Bayer wrote: >> >> On Oct 16, 2010, at 2:03 PM, Michael Hipp wrote: >> >>> On 10/16/2010 12:52 PM, Michael Bayer wrote: >>>> >>>> On Oct 16, 2010, at 1:02 PM, Michael Hipp wrote: >>>> >>>>> On 8/24/2010 9:47 PM, Michael Bayer wrote: >>>>>> Michael Hipp wrote: >>>>>>> How do I make a copy of an orm object such that modifications to the >>>>>>> copy do not affect the original? >>>>>> >>>>>> 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. >>>>>> >>>>>> x = MyObject() >>>>>> for a in dir(myoldobject): >>>>>> if not a.startswith('_'): >>>>>> setattr(x, a, getattr(myoldobject, a)) >>>>> >>>>> Resurrecting an old thread ... >>>>> >>>>> I'm just now getting around to try this but I'm finding out it doesn't >>>>> really work like I'd hoped. >>>>> >>>>> As soon as 'getattr' hits a column with a ForeignKey it immediately tries >>>>> to autoflush INSERT 'x'. But 'x' is only half-baked and not ready to be >>>>> saved. >>>>> >>>>> In fact, I don't ever want to save 'x', and I especially don't want to >>>>> INSERT it. It would be a duplicate of 'myoldobject'. >>>>> >>>>> Is there a way to copy an orm object and tell it "don't ever save this I >>>>> just want to keep it around to look at"? >>>>> >>>>> Alternatively I can just copy all the attributes to a dict(), but that's >>>>> a bit messy. >>>> >>>> dont put it in the Session. >>> >>> That makes sense. But how do I not do that? As in your example code above >>> I'm not adding it to a session, at least not intentionally. >> >> don't call Session.add(). the code above doesn't add to a session unless >> you're using some special extensions like Session.mapper. > > As shown exactly in the code above, I do *not* call Session.add(). > > It appears to be doing the add when it hits the ForeignKey field. Then it not > only does an add it also attempts an INSERT (which thankfully fails since the > object is not ready to be saved).
you mean a relationship(). Yeah, if you do this: x = MyObject() foo_bar = Session.query(FooBar).first() x.some_related = foo_bar where "some_related" has a backref to "collection_of_myobject", the cascade will put it in to that session which FooBar belongs. This behavior is configurable via the "cascade" argument on relationship(), and even more so using the new "cascade_backrefs" flag available in 0.6.5. But also you need to decide what you are really trying to do here, if you even want FooBar populated on your non-persisted object. -- 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.