Thanks so much. flush() was exactly what I needed. I wasn't using
flush() because I was creating my session with autoflush=True, and I
was unclear on the semantics of that flag. I thought autoflush=True
meant it flushed everything right away, but it doesn't actually
flush() until required to do so by a subsequent database access.

-matt

On Dec 28, 5:46 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> Im assuming you're writing an ORM centric application for my answers
> below.  If not, the answers would be slightly different.
>
> On Dec 28, 2007, at 8:02 PM, Glypho Phobet wrote:
>
>
>
> > Problem #1: I can't get the id of row1 until I commit the
> > transaction. I'd like to be able to get, before I commit, the id that
> > row1 will have after the commit, so that I can enter it in row2. Or
> > is there some way of telling SQLAlchemy that a particular column in
> > row2 should point to whatever the id of of row1 will be when the
> > commit happens?
>
> why cant you get the id until commit happens ?  with the ORM you just
> issue a flush() anytime you want and it will insert records/get new
> ids.  im assuming you are also using session.begin() and commit() to
> frame the larger transaction; within those, you can issue as many
> flush() calls as you like and they participate in the same
> transaction....so you can do any number of persists, loads, deletes,
> whatever, without ever having to commit anything.  you can also issue
> SQL if you wanted to execute postgres sequences or something like that.
>
> > Problem #2: If I commit before creating row2, in order to get the id
> > of row1, any changes I make to row1 after I commit are immediately
> > reflected in the database -- regardless of whether I commit or
> > rollback at the end. If I try to re-save row1 after making changes, I
> > get a traceback saying that row1 is "already persistent," like this:
>
> > <class 'sqlalchemy.exceptions.InvalidRequestError'>: Instance
> > '[EMAIL PROTECTED]' is already persistent
>
> > Is there a way to make this object non-persistent again?  I want to be
> > able to rollback all changes made to row1 and row2 together, if
> > there's an error.
>
> if a transaction fails, you need to remove (or repair, if thats
> feasable) whatever offending objects are present in the session.  if
> your process is going to re-do everything and recreate objects, you
> need to clear the whole session using session.clear()..this is
> typically the best approach after a transaction fails.   usually
> within a web application a failed transaction means youre going to
> report an error and end the request..if you are "retrying" wihtin one
> request and doing everything again (which is unusual), just do a
> clear().
>
> > Problem #3: Even if I do this in two separate transactions, and
> > re-query for row1 by id the second time I need it, SQLAlchemy returns
> > an instance that is "already persistent." Probably this is some sort
> > of
> > caching that SQLAlchemy is doing, which I will be very grateful in
> > general,
> > but is there a way to turn it off for one query?
>
> the session always returns the same instance for a particular primary
> key once its loaded or persisted.  if you want to remove that
> instance, use session.expunge(theinstance).  or as above
> session.clear() to clear the whole thing.

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to