This is my first such case in 5-6 years of using the SA. Usually the
problem was with my code. This could also be the case now, but it
escapes me where I made a mistake.

Thank you for your time. I will consider this closed for now and move
on using a workaround of explicitly populating campaign_id. I guess I
will try 0.6 or even 0.7 in the next few months.

Thanks,
Tvrtko

P.S. for the curious, my relations go like this:

from elixir import Entity, Field, ...

class Campaign(Entity):
    id = Field(Integer, Sequence('cc_campaign_seq'),
colname='campaign_id', primary_key=True)
    qitems = OneToMany('QItem')

class QItem(Entity):
    id = Field(Integer, Sequence('cc_qitem_seq'), colname='qitem_id',
primary_key=True)
    campaign = ManyToOne('Campaign', colname='campaign_id',
required=True)


On Jan 15, 5:32 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Jan 15, 2011, at 11:10 AM, Tvrtko wrote:
>
>
>
>
>
>
>
>
>
>
>
> > 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, ...}
>
> OK, then I need a full reproducing test case which shows how that result 
> occurs.    Its not a known issue off the top of my head.  Also, please note 
> that I am in no way suggesting you upgrade your application to 0.6, however, 
> if you test your development code with 0.6 and the problem goes away, that 
> would indicate something specific to 0.5 might be the cause.    I would 
> suggest that it may be related to how your relationships are set up, such 
> that a dependency between QItem and Campaign is not correctly established, 
> leading the ORM to sometimes handle one or the other first.

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