On Tue, Jun 19, 2012 at 01:54:21PM -0400, Claudiu Saftoiu wrote:
> Ideally I could do something like this:
>     class Foo(Persistent):
>         def __init__(self, a):
>             self.a = a
>             self.b_cache = PersistentDict()
>         def __just_loaded__(self):
>             if not hasattr(self, 'b_cache'): self.b_cache = PersistentDict()
>         def calc_it(self, b):
>             if b in self.b_cache: return self.b_cache[b]
>             res = expensive_function(a, b)
>             self.b_cache[b] = res
>             return res
> That is, a function called whenever the object is loaded, that does
> all the necessary backwards-compatibility work right there. It
> separates the backwards-compat code cleanly, and also only updates the
> objects as-needed... though still a minor performance hit as it does
> the check each time the object is loaded.
> Is there a way to do that last option?

Yes, you can override __setstate__:

    def __setstate__(self, state):
        super(Foo).__setstate__(self, state)
        if not hasattr(self, 'b_cache'):
            self.b_cache = PersistentDict()

This assumes you haven't been defining other pickling protocol
functions like __reduce__, and so cPickle -- which is the foundation
of ZODB -- uses the usual __getstate__/__setstate__ pair.

> What's the best practice for this sort of thing, in general?

It depends. :-)

If the new attribute is immutable, you can set it as a class attribute.

If it's easy to locate all Foo objects in your DB, you may want to write
a generation script (see http://pypi.python.org/pypi/zope.generations)
and do the migration once, instead of paying the cost of checking for
missing attributes on every single object load.

It's also best to avoid write-on-read semantics, because those tend to
cause database growth and increase the chances of getting ConflictErrors.

Marius Gedminas
An expert is a person who has made all the mistakes that can be made in a very
narrow field.
        -- Niels Bohr

Attachment: signature.asc
Description: Digital signature

For more information about ZODB, see http://zodb.org/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org

Reply via email to