On Jan 15, 4:35 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> So, you have A->B, an exception occurs, you do the rollback, then you're 
> somehow trying to continue on within the web request ?     The code examples 
> here are out of context snippets and I don't see any exception handling 
> happening so they don't really tell me much.    When the flush fails, the 
> internal state is completely expired.   Campaign, if pending when the 
> transaction started, now transient again, qitem is also transient.   Previous 
> flushes within that transaction have no effect on this.    Campaign and qitem 
> would retain their relationship to each other, campaign_id would probably 
> remain present, but if you were to re-add the two, it would be overwritten on 
> the next flush.

You are right. I presented the issues in a confusing manner because I
was not exactly sure what was happening in the first place.

I am *not* continuing with request after exception. I was reraising
exception after a debug print. Unfortunately that debug print has lead
me in the wrong direction of thinking that objects were expunged
before the flush. That is not the case.

What actually happens is that save mechanism sometimes gets underlying
ID from related object end sometimes it doesn't. Note that campaign
has ID, and that campaign is associated with qitem and still,
qitem.contact_id is not allways set during a save/flush.

Debug print from inside `mapper._save_obj()`:

Good case:

   qitem state dict = {'campaign': <Campaign 233, u'Test'>,
'campaign_id': 233, ...}

And for the bad case:

   qitem state dict = {'campaign': <Campaign 234, u'Test'>,
'campaign_id': None, ...}

>
> In my development, if a web request has an exception, that web request is 
> over, so the use case here is a little confusing to me to start with, and I 
> don't really understand why you need to manually flush or not since I don't 
> have a clear illustration of the issue.

I never explicitly flush. I don't like it. I was only saying that if I
want to make a *workaround* and say:

    qitem.campaign = campaign # sometimes has "no effect"
    qitem.campaign_id = campaign.id  # need flush for id

I have to call flush() before I have an ID.

>
> On Jan 15, 2011, at 9:27 AM, Tvrtko wrote:
>
>
>
>
>
>
>
> > I've drilled down all the way up to `mapper._save_obj()`. I examined
> > the `state.dict` for `qitem`.
>
> > Good case:
>
> >    qitem state dict = {'campaign': <Campaign 233, u'Test'>,
> > 'campaign_id': 233, ...}
>
> > And for the bad case:
>
> >    qitem state dict = {'campaign': <Campaign 234, u'Test'>,
> > 'campaign_id': None, ...}
>
> > The `campaign` property is *relation* to `Campaign` entity. Campaign
> > is previously flushed and has id. But, for some reason the
> > `campaign_id` is missing inside `qitem` state event though the
> > `campaign` is present.
>
> > I can probably work around by saying:
>
> >    qitem.campaign_id = campaign.id
>
> > but then I must rely on campaign being flushed which might not allways
> > be the case. Yes, I can flush it manually, but I like to depend on
> > relations functioning properly.
>
> > P.S. I am not restarting or changing application in any way, just
> > refreshing a web page, which sometime fails and sometime succeeds.
>
> > --
> > 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 
> > 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 sqlalchemy@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