I resolved that problem. The metaclass was screwing things up (opening the storage before the class was created).
On 24.02.2010, at 22:32, Kaweh Kazemi wrote: > Hi there, > > started using ZODB3 with a new project of mine and I've encountered a > problem, I couldn't find a solution for so far. > > I'm adding instances of a class User to a storage (FileStorage for now). I > did this in a small test program which worked fine. But then I started to > refactor components out of the test program into a module hirarchie and I'm > encountering "persistent broken" instances now. > > 1) First run: no database nor users created yet, creating a FileStorage, > adding 3 users to the database will yield something like this (output within > the tester after the work has been done): > > [<rp.framework.user.User object at 0x1016986e0>, > <rp.framework.user.User object at 0x101698758>, <rp.framework.user.User > object at 0x101698848>] > > 2) Second run: reopening previous database, adding 3 new users to the > database will yield something like this (output within the tester after the > work has been done): > > [<persistent broken rp.framework.user.User instance > '\x00\x00\x00\x00\x00\x00\x00\x02'>, <persistent broken > rp.framework.user.User instance '\x00\x00\x00\x00\x00\x00\x00\x04'>, > <persistent broken rp.framework.user.User instance > '\x00\x00\x00\x00\x00\x00\x00\x05'>, <rp.framework.user.User object at > 0x1017ad410>, <rp.framework.user.User object at 0x1017adc80>, > <rp.framework.user.User object at 0x1017adde8>] > > 3) Subsequent runs will add three users with the same output, just the number > of persistent broken users is incorrect. > > Now I understand that a class is "broken" if the import of that class during > opening of the database fails. But I'm doing the runs without changes in > between the runs, no changes to the module structure or code and running the > exactly same tester (which just re-opens the database and add three new > instances). > > I digged deeper into ZODB.broken to better understand what is happening when > the module is imported for a storage. It seems that while opening the > database the import of the same module gives slightly different results than > later in the script when adding new users. > > I wonder if that's related to my module structure, which looks similiar to > this: > > rp/ > __init__.py > framework/ > __init__.py > ... > user.py - this holds the class User, which is a > subclass of Entity (see below) > > odb/ > __init__.py > ... > entity.py - this holds the class Entity, which does a > couple of general things for my implementation, which is a subclass of > Persistent; class Entity has a class EntityMeta as it's __metaclass__ to > handle some magic for me (very similar to what Elixier does for SQLAlchemy, > but not that sophisticated) > > I'm not doing anything in the __init__.py (so I'm not mangeling the module > imports in any way, it's just a pure, very young structure I'm building up). > > The tester is outside of the rp module and just does a "from > rp.framework.user import User", always the exact same import and still I get > the same issue. > > I tried a couple of tricks in the __init__.py things, or changing sys.path, > sys.modules, or even PYTHONPATH, but to no avail. > > One thing I still wonder is, when exactly find_module is called? Is it called > when opening the storage (which happens in my EntityMeta class, so during the > creation of the Entity class - and that might ruin everything), or when an > object is accessed the first time? Can this behaviour be controlled? > > I'm quite certain I miss something quite obvious, but I'm stuck. > > Any hints appreciated. > > Cheers, > Kaweh > _______________________________________________ > For more information about ZODB, see the ZODB Wiki: > http://www.zope.org/Wikis/ZODB/ > > ZODB-Dev mailing list - ZODB-Dev@zope.org > https://mail.zope.org/mailman/listinfo/zodb-dev _______________________________________________ For more information about ZODB, see the ZODB Wiki: http://www.zope.org/Wikis/ZODB/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev