Frage
Antwort
Bei der Änderung von Attributen einer Objektinstanz muß darauf geachtet werden, ob das geänderte Attribute unveränderbar (immutable:Strings, Tuple) ist oder veränderbar (mutable: Dicts, Listen). Die ZODB kann implementierungsbedingt nicht merken, wenn man in einer Transaktion z.B. ein Dict oder eine Liste ändert. D.h. die Änderungen werden am Transaktionsende nicht in der ZODB gespeichert, d.h. solche Änderungen überstehen einen Neustart nicht.
Der ZODB muß signalisiert werden, dass sich die Attribute geändert haben:
class foobar:
def __init__(self):
self.d = {}
def some_method(self, k, v):
self.d[k] = v
self._p_changed = 1
Das Setzen von _p_changed = 1 signalisiert der ZODB die Attribute in die ZODB zurückzuschreiben.
Referenzen:
- Zope Developers Guide (ZDG)
- http://zope.org/Documentation/Articles/ZODB1