Laurence Rowe wrote: > > 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 > >
Laurence, Thank you and all of you. I understand the principle and right off the bat I do not see why I am breaking it, but I will look hard and long at the roblem. Thank you for giving me a starting point. Tom -- View this message in context: http://www.nabble.com/zodb-does-not-save-transaction-tp17526533p17547540.html Sent from the Zope - ZODB-Dev mailing list archive at Nabble.com. _______________________________________________ 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