Ah, I understand the reasoning now.  Adding the flush in between the
delete and add did just the trick; thank you for the explanation,
Mike!

Andrew

On May 19, 10:29 am, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On May 19, 2010, at 10:16 AM, Andrew wrote:
>
>
>
> > We're using ORM to do unit testing, so we're mocking up the commit
> > message to do nothing, basically creating a long transaction that's
> > rolled back at the end of the test.  However, I am running into the
> > following problem.  Assume we've mapped a table to class MyTable with
> > a varchar `name' and a boolean `flag' that defaults to false:
>
> >    Session.add(MyTable(name="Bob"))
> >    bob = Session.query(MyTable).filter_by(name="Bob").first()
> >    bob.flag = True
>
> >    Session.query(MyTable).filter_by(name="Bob").first()
> >    Session.delete(bob)
>
> >    # At this point, Bob does not exist and doing a query *will* fail
> > within the transaction
> >    Session.add(MyTable(name="Bob"))
> >    bob = Session.query(MyTable).filter_by(name="Bob").first()
> >    assert_equals(bob.flag, False)
>
> > This now fails with bob.flag still being set to True from the previous
> > update, even though the default value in the DB is set to be False by
> > default (and works correctly on the initial insert).  Running this
> > with commits turned on does not run into this problem.
>
> > Before submitting a bug, I want to make sure there's not a config
> > setting somewhere that we're missing.  We are running this against
> > postgresql 8.4 with sqlalchemy 0.6.
>
> this is the expected behavior as a flush() that receives a delete() and 
> insert() of the same effective row (assuming "name" is the primary key here) 
> is converted to an UPDATE.   If you put a flush() after the delete() of bob1 
> the next add() would result in an insert.
>
> this behavior is due to the fact that the unit of work emits all 
> inserts/updates before all the deletes within a single flush.   the UOW 
> rewrite of 0.6 broke the very first ground on us being able to make this 
> behavior more flexible, but such functionality is a long way off.
>
> --
> 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 
> 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 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