[Zope3-Users] Re: updating a zodb with a SchemaManager

Jürgen Kartnaller juergen at kartnaller.at
Thu Mar 6 03:11:37 EST 2008



Lorenzo Gil Sánchez wrote:
> Hi,
> 
> I've been using a zope.app.generations.interfaces.ISchemaManager to keep
> my database up to date with respect to the changes in the models of my
> application and everything is well so far.
> 
> Now I have a tricky situation. My model had an attribute and now I
> changed that attribute to be read only.
> 
> Before:
> -------
> 
> class IModel(Interface):
> 
>   attr1 = zope.schema.TextLine()
> 
> class Model(Persistent):
>   implements(IModel)
> 
>   def __init__(self, attr1=None):
>     self.attr1 = attr1
> 
> After:
> ------
> 
> class IModel(Interface):
> 
>   attr1 = zope.schema.TextLine(readonly=True)
>   attr2 = zope.schema.TextLine()
> 
> class Model(Persistent):
>   implements(IModel)
> 
>   def __init__(self, attr2=None):
>     self.attr2 = attr2
> 
>   def _getAttr1(self):
>     return self.attr2.lower()
>   attr1 = property(_getAttr1)
> 
> As you can see, now attr1 is a computed attribute from attr2.
> 
> When updating the old Model objects I add the 'attr2' attribute but I
> can't remove the old 'attr1' attribute since is still defined in Model
> but is a totally different thing.
> 
> I can forget about removing the 'attr1' attribute and things keep
> working well. The problem is a waste of space in the database since that
> information is still there but impossible to retrieve, right?
> 
> I have a related question: is attr1 still saved in the database in the
> newer version no matter is a read only python property or does the ZODB
> handle this case? As far as I know ZODB only skip those attributes
> beginning with _v_ (for volatile), but don't know what it does with
> python properties...
> 
> Has anyone ever reached a similar situation? Any solution?

You can do this on your instance :

  del obj.__dict__['attr1']

Jürgen



More information about the Zope3-users mailing list