On Mon, Feb 02, 2004 at 02:55:02PM +0000, Steve Harris wrote: > On Mon, Feb 02, 2004 at 09:36:02 -0500, Paul Winkler wrote: > > > and wether you are willing to change. > > > > I do web development with Zope. My site code never depends on > > the data store :-) > > I'm not sure if thats a joke or not ;) Zope is based on an OODB IIRC. > thier not very good at schema independence in my experience. I'm not sure what "schema independence" means, so I will assume it means the ability to extend or modify the schema after you've already got live instances. I'm curious what languages you've used with an OODB. I imagine it would be a major pain if you didn't have as much runtime flexibility as python (e.g. ruby would be just fine, C would be insane, dunno about java). It's been a non-issue in the 3 years I've been doing Zope. Content types in zope are generally defined with classes. Adding an attribute to a class requires me to add a couple of lines to the class definition, including one to provide a default class-level value, then I tell zope to reload the class by clicking a button in the zope management interface. Live instances immediately see the default value. This requires no deep magic, it's just how python works. An untested-but-should-work example (feel free to skip the rest of this message): from ZODB import Persistence class SoftwareResource(Persistence.Persistent): meta_type='Software Resource' def __init__(self, name='', author='', download_url=''): self.name=name self.author=author def setAuthor(self, author): # setter methods are totally optional in python, # but we usually use them in zope so we can # declare security restrictions on them, # which I won't bother with in this example. self.author = author def setName(self, name): self.name = name Now let's add a release_number attribute with a default value of '': class SoftwareResource(Persistence.Persistent): release_number = '' ... def __init__(self, name='', author='', release_number=''): ... self.release_number=release_number ... def setRelease(self, release_number): self.release_number=release_number Reload the class and you're done. Changing the 'author' attribute to 'author_name' is only barely more difficult. You can embed self-upgrading code in the class, but such code has a way of sticking around long after it should be deleted. Another way to do it is with a trivial upgrade script like this, to be run once after reloading the relevant class changes: # A bit like find . -type ... for obj in context.ZopeFind(meta_type='Software Resource'): if not hasattr(obj, 'author_name'): obj.setAuthor(obj.author) del(obj.author) -- Paul Winkler http://www.slinkp.com Look! Up in the sky! It's THE FISHY ANUS! (random hero from isometric.spaceninja.com)