I am beginning to enjoy working with zodb. Again this is a quick note, pretty much like my previous post on zodb undo and conflict resolution..
I knew from my early Zope days that one could export and import arbitrary zope objects but never had a reason to code it or inspect its innards. Today though I wanted to export only a sub-section of our new beta site so that we could merge its contents with an already up and running ‘live’ site. So, I decided to search. One of the biggest problems with zope (and it’s related components) is the lack of authoritative and comprehensive documentation.
I found various scripts on the interwebs which showed how to walk a zodb object hierarchy. For instance:
However, there was very less information on how to actually export arbitrary objects using some built-in api (after all there had to be one !) and every less how to import exported .zexp files ! So, I hit the code. ZODB has a nicely named module ExportImport.py which exposes two neat functions exportFile() and importFile(). They do what they say and you’ll see the code is pretty much what you’d expect — walk the oids and serialize/load the objects …but wait there is more ! ZODB Connection class actually derive from ExportImport ! So, these functions may be used quite simply like this:
>>> # ...assuming you are in the debug prompt with context as the >>> # object you want to export >>> >>> oid = context._p_oid >>> conn = context._p_jar >>> conn.exportFile(oid, 'context.zexp') ..... >>> # ...assuming you are in the debug prompt, you have an exported >>> # zexp and context is the parent where you want to import and >>> # place your imported 'new_folder' >>> >>> conn = context._p_jar >>> imported = conn.importFile('new_folder.zexp') >>> context['new_folder'] = imported >>> import transaction >>> transaction.commit() # Do not forget to do this
Simple innit ? Hope someone out there finds this useful.