[ZODB-Dev] Broken instances after refactoring in ZODB
Marius Gedminas
marius at gedmin.as
Fri Oct 3 13:59:30 EDT 2008
On Fri, Oct 03, 2008 at 11:37:35AM +0100, Adam wrote:
> Hi, I wonder if anyone can help me.
>
> I've got a custom Python cgi which runs in one directory using ZODB for
> the database. It runs in a directory off the site root ie. /System
>
> It's got a bit unwieldy in there so I wanted to separate the core
> modules out as I don't really touch them any more, so adding
> subdirectories:
>
> /System/Core
> /System/Application
>
> In System, I created a dummy frontend CGI like the following:
>
> # /System/frontend.py
> import ZODB
> from Core import *
> from Application import *
> site = Start.ProcessRequest() # Start is a module in Core
> site.Main()
>
> For some reason, all the Persistent derived objects in the database are
> returning: <broken Module.Class instance>
>
> Does ZODB do something with __import__ modules which may cause it to
> lose the references to the classes/modules?
The ZODB stores fully qualified class names (package.module.class). If
you move the modules around, ZODB can no longer find the classes in
their old locations.
> Is there any way to fix the database
Yes, but it's not pretty:
1. create modules in their old locations that import all the classes
from the new locations (and do nothing else).
2. write a script that opens the DB, iterates over all persistent
objects in it, touches every single one of them (obj._p_activate()
followed by obj._p_changed = True) and commits the transaction.
If you've done everything right, now the database should refer to all
the classes using their new locations.
> or do I have to return to putting
> all my .py files in one directory.
Third alternative: create modules for backwards compatibility (just the
step 1 described above).
Marius Gedminas
--
Those who can't write, write manuals.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mail.zope.org/pipermail/zodb-dev/attachments/20081003/ee637654/attachment.bin
More information about the ZODB-Dev
mailing list