Thanks Michael for the confirmation/explanation.

On Nov 29, 8:25 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Nov 29, 2010, at 8:28 AM, Naresh Khalasi wrote:
>
> > Hi,
>
> > After some more internal discussions we tried and realized that the version 
> > col is not really required at the child table level.
> > The second commit in the sample code fails because the version value on the 
> > parent row has already moved ahead.
>
> > Please confirm if the understanding/conclusion is correct.
>
> the version col would be just on the base table, that's correct, since no 
> child row should ever exist without a parent row, which establishes the 
> version.  As far as what happens when version_id_col is placed on two tables 
> internally, I'd have to try that out to see why you got silent failure on 
> that.  We try to add warnings or exceptions for the wide variety of 
> configurational mistakes that are possible.   Ideally the version_id_col on 
> both parent and child would actually work as expected, i.e. both columns get 
> populated equally.
>
> Looking at the sample code, the structure of change/commit created at the end 
> appears to be the classic case the version id col was designed to detect - 
> concurrent modification.   The most recent 0.6 release renamed the exception 
> "StaleDataError" to prevent confusion with threading/process issues, which 
> aren't necessary to produce this condition.
>
>
>
>
>
>
>
>
>
> > Regards,
> > Naresh
>
> > On Mon, Nov 29, 2010 at 2:21 PM, Naresh <nkhal...@vayana.in> wrote:
> > Hi,
>
> > We have a parent class/table (Notification/notifications) and a child
> > class/table(BusinessNotification/business_notifications).
> > Both of them have a version_id_col defined.
> > We are facing ConcurrentModificationException errors for the  model at
> > the end of the mail.
> > The problem is because the update state generated uses 'None' a the
> > value for notifications.version column.
>
> > We tried removing the version_id_col mapper arg in the child class -
> > BusinessNotification and then the error went away and the update
> > statement used the correct version column value to update.
>
> > So, firstly we are wondering how do we fix the situation that we can
> > have a version_id_col in the child class/table as well?
>
> > Upon further investigations,  we noticed that in the other parts of
> > the application we used the following approach.
>
> > parent_table = Table( ... )
> > class Parent(DeclarativeBase):
> >    __table__ = parent_table
> >    __mapper_args__ = {'polymorphic_on': parent_table.c.type,
> > 'version_id_col': parent_table.c.version}
>
> > child1_table = Table( ... )
> > class Child1(DeclarativeBase)
> >    __table__ = child1_table
> >    __mapper_args__ = {'polymorphic_identity':'c1',
> > 'version_id_col':child1_table.c.version_num}
>
> > With the above style of coding our models, we don't get
> > ConcurrentModificationException, but any update statement to the
> > parent_table does not use version column.
>
> > Please throw some light on these behaviors.
>
> > Regards,
> > Naresh
>
> > P.S. The model and sample client code follows.
> > ------------------
>
> > class Notification(DeclarativeBase):
> >    """This entity represents the notifications saved for sending
> > later """
> >    __tablename__ = 'notifications'
> >    __table_args__ =  {"mysql_engine":"InnoDB",
> >                       "mysql_row_format":"DYNAMIC",
> >                       "mysql_charset":"utf8"}
>
> >    id = Column(bigint, primary_key=True, autoincrement=False)
> >    entid = Column(bigint, ForeignKey('enterprises.entid',
> > name='fk_notifn_entid'), nullable=False)
> >    notification_type = Column(types.String(30), nullable=False)
> >    source = Column(types.String(30), nullable=False)
> >    data  = Column(text_type, nullable=False)
> >    status = Column(types.String(12), nullable=False, default='new')
> >    created_on = Column(types.DATETIME, nullable=False,
> > default=func.current_timestamp())
> >    last_updated = Column(types.DATETIME, nullable=True,
> > onupdate=func.current_timestamp())
> >    version = Column(types.SMALLINT, nullable=False, default=0)
> >    __mapper_args__ = {'polymorphic_on': notification_type,
> > 'polymorphic_identity':'incident', 'version_id_col': version}
>
> > class BusinessNotification(Notification):
> >    """This entity represents the business notifications """
> >    __tablename__ = 'business_notifications'
> >    __table_args__ =  {"mysql_engine":"InnoDB",
> >                       "mysql_row_format":"DYNAMIC",
> >                       "mysql_charset":"utf8"}
>
> >    notification_id = Column(bigint, ForeignKey('notifications.id',
> > name='fk_bn_notificationid'), primary_key=True, autoincrement=False)
> >    event_id = Column(bigint, ForeignKey('doc_events.id',
> > name='fk_bn_eventid'), nullable=True)
> >    created_on = Column(types.DATETIME, nullable=False,
> > default=func.current_timestamp())
> >    last_updated = Column(types.DATETIME, nullable=True,
> > onupdate=func.current_timestamp())
> >    version_num = Column(types.SMALLINT, nullable=False, default=0)
> >    __mapper_args__ = {'polymorphic_identity':'event',
> > 'version_id_col': version_num}
> > #    __mapper_args__ = {'polymorphic_identity':'event'}
>
> > if __name__ == '__main__':
> >    try :
> >        qry = meta.Session().query(BusinessNotification).filter(and_(
>
> > BusinessNotification.status=='new',
>
> > BusinessNotification.created_on < now()))
> >        qry = qry.order_by(BusinessNotification.created_on)
> >        all_notifications = qry.all()
> >        for notification in all_notifications :
> >            # some business logic to trigger status update
> >            notification.status='in_progress'
> >        meta.Session().commit()
> >    except Exception as ex :
> >        log.error("Error Identifying Notification Recipients")
> >        log.exception(ex)
> >        meta.Session().rollback()
> >    finally :
> >        meta.Session.remove()
>
> > --
> > Naresh Khalasi | Vayana Services (http://www.vayana.in) | +91-9892294598
>
> > --
> > 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.
> > <sqlq.py>

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