On Jan 15, 5:53 pm, Tvrtko <qvx3...@gmail.com> wrote: > 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.
I couldn't resist. I'm pleased to say that it works just fine in SA 0.6 > > 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.