Firstly, apologies if I'm demanding too much but basically I'm quite a
beginner at Python programming and this is for a University project,
which is why I'm keen to get this done (due in a few days!). So I hope
you won't mind me asking some questions that may seem really basic.

> 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.

Could you explain what you mean by creating a new object with
__init__() and setting up the attributes? Would this be a new class
that isn't mapped using SQLA?

> 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.

Could you please explain what you mean by that? Would it be possible
to give me an idea or an example of how such would work?

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

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

I'm not issuing a session.close() anywhere (I checked). Are there any
other ways of closing a session besides that? (If the answer is
"Plenty", don't worry about it... I'll try to track it down then)

On Jun 3, 8:22 pm, Az <[email protected]> wrote:
> I think I get what you mean. In the mean time, another error popped
> up:
>
> Traceback (most recent call last):
>   File "Main.py", line 32, in <module>
>     MCS.addToTable()
>   File "XXXXXXX/MonteCarloSimulation.py", line 138, in addToTable
> ####### <------- This function is described in the first post
>     session.flush()
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> session.py", line 1354, in flush
>     self._flush(objects)
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> session.py", line 1432, in _flush
>     flush_context.execute()
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> unitofwork.py", line 261, in execute
>     UOWExecutor().execute(self, tasks)
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> unitofwork.py", line 753, in execute
>     self.execute_save_steps(trans, task)
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> unitofwork.py", line 768, in execute_save_steps
>     self.save_objects(trans, task)
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> unitofwork.py", line 759, in save_objects
>     task.mapper._save_obj(task.polymorphic_tosave_objects, trans)
>   File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/
> lib/python2.6/site-packages/SQLAlchemy-0.5.8-py2.6.egg/sqlalchemy/orm/
> mapper.py", line 1303, in _save_obj
>     (state_str(state), instance_key, state_str(existing)))
> sqlalchemy.orm.exc.FlushError: New instance <Student at 0x24fe7b0>
> with identity key (<class 'ProjectParties.Student'>, (7713,))
> conflicts with persistent instance <Student at 0x140f090>
>
> What's going on here with the flush error?
>
> I've gone back to using just copy.copy(some_dictionary) just >>after<<
> I read into my dictionaries and >>before<< I start doing stuff like
> monteCarloSimulation (above) and addToTable (above). Even if I stick
> the copy.copy() after addToTable(), it still manages to give me the
> same error.
>
> On Jun 3, 7:41 pm, Michael Bayer <[email protected]> wrote:
>
> > 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 
> > > athttp://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