[Zope-dev] nasty persistence problem

Chris McDonough chrism@zope.com
Mon, 15 Oct 2001 16:39:10 -0400


> Tim McLaughlin wrote:
> >
> > Thanks Chris, I'll hold on to that for a rainier day.  I just worked
> > this one out in a very roundabout way ;)
> >
> > A product had gotten copied in that moved a Product class from one
> > module to another even though everything else was the same.  It seems
> > that ZODB doesn't like that.
>
> It sure doesn't.  When it pickles an object, it says, here's a big
> binary blob that is the state of the object.  The code for the object
> can be found in Products.MyProduct.MyModule.MyClass.  When you move the
> code, ZODB understandably barfs.
>
> If I remember correctly, there is a way to make an alias in an old
> location that points to a new location when you *must* move the code for
> whatever reason.  I forget how it works though...

It works by putting a tuple of tuples in your Product's __init__.py module
in a __module_aliases__ attribute at module scope.  For example,
PythonScripts have the following __module_aliases__ attribute.

  from Shared.DC import Scripts
  __module_aliases__ = (
      ('Products.PythonScripts.Script', Scripts.Script),
      ('Products.PythonScripts.Bindings', Scripts.Bindings),
      ('Products.PythonScripts.BindingsUI', Scripts.BindingsUI),)

.. this maps the module that *used* to be at Products.PythonScripts.Script
to the module that is *now* at Scripts.Script, etc.  This only works with
modules and not with classes or other types.