tsmiller wrote:

I have a bookstore that uses the ZODB as its storage.  It uses qooxdoo as
the client and CherryPy for the server.  The server has a 'saveBookById'
routine that works 'most' of the time.  However, sometimes the
transaction.commit() does NOT commit the changes and when I restart my
server the changes are lost.


This sounds like you are using mutable data types (like lists or dicts) in
the
non-persistence aware variants.

Christian, thanks for the reply.
When I save a book I save a dictionary where all of the keys are strings and
all of the values are strings. But what you say makes sense.  I keep
thinking that it must have something to do with the data itself.  I will
check very carefully to make sure that I am not saving anything but strings
in the book record.  Thanks.  Tom

The problem is not saving things that are not strings, but modifying a non persistent object without notifying the parent persistent object that a change has happened and it needs to be saved.
e.g.

you have a persistent object (inherits from persistent.Persistent) pobj

>>> pobj.dict = {}
>>> transaction.commit()
>>> pobj.dict['foo'] = 'bar'
>>> transaction.commit()
>>> print pobj.dict
{'foo': 'bar'}

#restart your python process
>>> print pobj.dict
{}

Instead you must either tell zodb the object has changed:

>>> pobj.dict = {}
>>> transaction.commit()
>>> pobj.dict['foo'] = 'bar'
>>> pbj._p_changed = True # alternatively: pobj.dict = pobj.dict
>>> transaction.commit()
>>> print pobj.dict
{'foo': 'bar'}

#restart your python process
>>> print pobj.dict
{'foo': 'bar'}

Or use a persistence aware replacement.

>>> from persistent.mapping import PersistentMapping
>>> pobj.dict = PersistentMapping()
>>> transaction.commit()
>>> pobj.dict['foo'] = 'bar'
>>> transaction.commit()
>>> print pobj.dict
{'foo': 'bar'}

#restart your python process
>>> print pobj.dict
{'foo': 'bar'}

The same principles apply to other mutable non-peristent objects, such as lists.

Laurence

_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to