behavior of __setstate__ for version updates
I would like to use setstate to update my new product version; i can't however seem to figure out how to get it to work as i would like. Here is what i am trying. In my product, i have defined setstate as follows: def __setstate__(self, state): Persistent.__setstate__(self, state) if not hasattr(self, 'blah'): self.blah = "This is a test" I also have added: def change_blah(self): """ docstring """ self.blah = "That was a test" return "blah changed" I restart zope, and visit a page that uses a dtml-var tag to print blah. It prints "This is a test" as expected. I then visit the changed_blah page, and go back to the dtml-var page at which point it displays "That was a test", also as i would have expected. Now if i restart and go back to the page, it states "This is a test". Why wasn't the thing stored in the ZODB? Also, if i comment out my two lines in __setstate__, restart, and try to access blah, it doesn't exist? Why isn't it getting written to the ZODB at all? After grepping about, i found that Xen does a get_transaction().commit() after their setstate stuff, but doing that doesn't seem to do me any good either. Am i incorrect to think that this should opperate differently then this? thanks sRp -- Scott Parish http://srparish.net
Scott, I have been fiddling with this stuff as well lately. Basically, changes that are made in the __setstate__ method are not committed to the DB. The only way that changes to the object made in the __setstate__ method will 'stick' is if the object is later modified, therefore saved, before you do the zope restart. terry as a Scott Parish wrote:
I would like to use setstate to update my new product version; i can't however seem to figure out how to get it to work as i would like. Here is what i am trying.
In my product, i have defined setstate as follows:
def __setstate__(self, state): Persistent.__setstate__(self, state)
if not hasattr(self, 'blah'): self.blah = "This is a test"
I also have added:
def change_blah(self): """ docstring """ self.blah = "That was a test" return "blah changed"
I restart zope, and visit a page that uses a dtml-var tag to print blah. It prints "This is a test" as expected. I then visit the changed_blah page, and go back to the dtml-var page at which point it displays "That was a test", also as i would have expected.
Now if i restart and go back to the page, it states "This is a test". Why wasn't the thing stored in the ZODB? Also, if i comment out my two lines in __setstate__, restart, and try to access blah, it doesn't exist? Why isn't it getting written to the ZODB at all?
After grepping about, i found that Xen does a get_transaction().commit() after their setstate stuff, but doing that doesn't seem to do me any good either.
Am i incorrect to think that this should opperate differently then this?
thanks sRp
-- Scott Parish http://srparish.net
------------------------------------------------------------------------ Part 1.2Type: application/pgp-signature
participants (2)
-
Scott Parish -
Terry Kerr