Re: persistence and __setstate__
Jim Fulton <[email protected]> Wed, 31 Jul 2002 13:42:54 -0400
| Newsgroups | gmane.comp.python.zope.zodb4 |
|---|---|
| Organization | Zope Corporation |
| Message-ID | <[email protected]> |
Jeremy Hylton wrote: >>>>>>"BAW" == Barry A Warsaw <[email protected]> writes: >>>>>>"JH" == Jeremy Hylton <[email protected]> writes: >>>>>>"FG" == Florent Guillaume <[email protected]> writes: >>>>>> > > JH> An object is always changed when its __setstate__() method is > JH> invoked, except perhaps for some degenerate cases. It would be > JH> unacceptable to mark an object as changed every time it is > JH> loaded. > > FG> So won't all objects that upgrade themselves in __setstate__ > FG> keep being upgraded whenever they are reloaded, until they are > FG> modified from outside __setstate__ ? > > JH> Yes. > > BAW> So that means that "schema" updates have to happen external to > BAW> the object, because you can't update in __setstate__ and have > BAW> that update persist? Which means if you say, added an > BAW> attribute to Foo objects in your database, you'll need a script > BAW> to troll through the database, looking for instances of Foo, > BAW> make the change, commit them and move on. That could be more > BAW> expensive than an on-demand update. > > If you put code in the __setstate__ to handle object evolution, that > code will be executed every time the object is loaded until there is a > transaction that also modifies the object. Doesn't sound too > pleasant, but also sounds unavoidable. > > Here are some sketches of other approaches: > > - The database could provide a mechanism to register an object > transform function that is executed when an out-of-date object is > loaded. The transform could execute in a separate transaction. The > hardest part is probably providing a means to identify which objects > are out-of-date, presumably some kind of class revision id. > > - It should be possible to provide some workaround to register an > object as modified within its __setstate__(). It's certainly > possible to explicitly register the object with the Connection, > although that doesn't mark it as changed. But we could add some > hacks. > > A potential concern for any solution: If the object is updated on > demand, it is probably important to execute the change as a separate > transaction. If you don't, then the object update gets mixed in with > arbitrary updates to other objects, which unnecessarily complicates > undo. > > Jeremy > > > _______________________________________________ > Zodb4-dev mailing list > [email protected] > http://mail.python.org/mailman/listinfo/zodb4-dev > > -- Jim Fulton mailto:[email protected] Python Powered! CTO (888) 344-4332 http://www.python.org Zope Corporation http://www.zope.com http://www.zope.org