btw, using the "__before_update__" technique introduced some weird data corruption issues for me when my class had PickleType datamembers. For instance, # Create the Foo class to map foos_table to class Foo(object): def __before_update__(self): self.some_pickle_type self.last_edit_date = datetime.now()
the sql update statement generated would set some_pickle_type to NULL, even though I hadn't modified the datamember. This doesn't matter hugely to me at the moment, because I no longer am using a table hierarchy, and hence don't need to use __before_update__ anymore, but thought I would mention it in case anyone else runs into it. >>> sqlalchemy.__version__ '0.5.4p2' On Mon, Mar 2, 2009 at 12:43 PM, John Fries <john.a.fr...@gmail.com> wrote: > Thanks Michael! That should have been obvious to me, but for some reason I > couldn't figure it out. > > > On Mon, Mar 2, 2009 at 11:24 AM, Michael Bayer > <mike...@zzzcomputing.com>wrote: > >> >> On Mar 2, 2009, at 2:16 PM, John Fries wrote: >> >> Hi all, >> >> I am having a problem that is identical to the one mentioned last year on >> this list: >> >> http://groups.google.com/group/sqlalchemy/browse_thread/thread/efd3993c94c8d162/37943cda02151f2b?lnk=gst&q=onupdate+inheritance#37943cda02151f2b >> >> I have Engineer and Manager tables that are inheriting from an Employee >> table using joined table inheritance. When I update one of the child >> tables, I want the last_edited timestamp column on the Employee table to be >> updated as well, but it is not updating. Mr. Bayer proposes the following: >> >> """ >> from sqlalchemy.orm import mapper as _mapper >> from sqlalchemy.orm import MapperExtension >> >> class MyExt(MapperExtension): >> def before_update(self, mapper, connection, instance): >> if hasattr(instance, '__before_update__'): >> instance.__before_update__() >> >> def mapper(*args, **kw): >> kw['extension'] = MyExt() >> return _mapper(*args, **kw) >> just hide that code away someplace, and then any instance which >> defines a method called __before_update__() will have it called before >> update. >> """ >> >> I've done that step, but I don't understand what the next step is. I >> thought that I would have to implement a __before_update__ method on my >> Engineer and Manager classes, which would then call some method on Employee >> using super. However, when I update my Engineer, it doesn't even look like >> the __before_update__ method is being called. So I conclude that I'm doing >> it wrong. Which instances should implement a __before_update__ method? >> What should the __before_update__ method do? >> >> >> just implement def __before_update__() on your base Employee class. this >> method should set the last_edited attribute to a new value (note you can set >> it to "func.now()" to have a SQL function fire off). Engineer and Manager >> will have the method automatically via class inheritance. Also make sure >> you are using the modfied mapper() function to create your mappers. >> >> >> --~--~---------~--~----~------------~-------~--~----~ >> 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<sqlalchemy%2bunsubscr...@googlegroups.com> >> For more options, visit this group at >> http://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.