On Jun 3, 2010, at 1:58 PM, Az wrote:

> "Owning session has been closed"? Can I still use deepcopy if the
> session has not been closed?

deepcopy has issues because SQLAlchemy places extra information on your 
objects, i.e. an _sa_instance_state attribute, that you dont want in your copy. 
 You *do* however need one to exist on your object.  Therefore deepcopy is not 
supported right now by SQLAlchemy ORM objects.   There are ways to manually 
blow away the old _sa_instance_state and put a new one on the object, but the 
most straightforward is to make a new object with __init__() and set up the 
attributes that are significant, instead of doing a full deep copy.

if you do really want to use deepcopy, you'd have to implement __deepcopy__() 
on your objects and ensure that a new _sa_instance_state is set up, there are 
functions in sqlalchemy.orm.attributes which can help with that.    This 
*should* be made an official SQLA recipe, but we haven't gotten around to it.

> How can I stop it from closing the
> sessions?

nothing in SQLA closes sessions.  Your program is doing that.


> The problem is that if I change my shallow copied
> dictionary, the objects are changed.
> 
> Basically, I'm trying to do this state change thing where I'll take a
> dictionary (let's call it Node 1), make changes to it (thereby making
> changes to the objects it references) and then save those changes as
> Node 2. Then I'll take Node 2 and make some changes to that. So on and
> so forth for a certain number of changes. Everytime I do so, I want to
> retain the information from the previous Node as well as a "best node"
> which can be any of the Nodes. If my operations change the objects, is
> that even possible?
> 
> That was my motivation to use deepcopy but I don't want to stop using
> SQLAlchemy because of it :(
> 
> On Jun 3, 4:57 pm, Michael Bayer <[email protected]> wrote:
>> On Jun 3, 2010, at 1:24 AM, Az wrote:
>> 
>>> +++ Questions +++
>> 
>>> 1. Is this the correct way to use sessions or am I sort of abusing
>>> them?
>> 
>> I dont see any poor patterns of use above.
>> 
>>> 2. When should I close a session?
>> 
>> when you no longer need the usage of any of the objects associated with it, 
>> or any remaining objects are in a state which you will re-merge them into a 
>> new session before you next use them.    The session in its default state of 
>> autocommit=False is just like going to your database and starting a 
>> transaction, doing some work - when you're done with the work, you close the 
>> transaction, and all the data associated with that trans (i.e. your ORM 
>> objects) is essentially "invalid"; other transactions can be modifying that 
>> data.   Your objects are an extension of the Session, which should be 
>> considered as an object-oriented window onto a database transaction.
>> 
>>> 3. I got the following error after trying to use copy.deepcopy() on
>>> one of my dictionaries.
>> 
>>>    "attribute refresh operation cannot proceed" % (state_str(state)))
>>> sqlalchemy.exc.UnboundExecutionError: Instance <Project at 0x24c5c50>
>>> is not bound to a Session; attribute refresh operation cannot proceed
>> 
>> don't do deepcopy() on a structure that contains ORM objects if their owning 
>> session has been closed.  deepcopy on ORM objects probably has issues that 
>> prevent it from working as you'd expect.   You'd be better off building copy 
>> constructors, i.e. def copy(self):  return FooBar(....).
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to