ZODB/PersistentMapping problem
Hi all, I've been experimenting with the ZODB and Persistence modules following the ZODB-Howto. Using the example code I've seem to have encountered a problem in PersistentMapping.py: PersistentMapping.keys() does, apparently not support int keys: def keys(self): try: return self._v_keys except: pass keys=self._v_keys=filter( lambda k: k[:1]!='_', self._container.keys()) keys.sort() return keys will cause Traceback (innermost last): File "./hello.py", line 73, in ? myapp.testread() File "./hello.py", line 67, in testread print self.root.keys() File "/usr/lib/zope/lib/python/ZODB/PersistentMapping.py", line 142, in keys self._container.keys()) File "/usr/lib/zope/lib/python/ZODB/PersistentMapping.py", line 140, in <lambda> lambda k: k[:1]!='_', TypeError: unsliceable object when using int keys. Is this a bug or a feature ?? Using instead: def keys(self): try: return self._v_keys except: pass keys=self._v_keys=filter( # lambda k: k[:1]!='_', lambda k: str(k)[:1]!='_', self._container.keys()) keys.sort() return keys appears to do the job. But I cannot predict unforeseen consequences from this hack. ------------------------------- hello.py -------------------------------------- #!/usr/bin/python import Persistence import ZODB import ZODB.FileStorage class Person(Persistence.Persistent,Persistence.PersistentMapping): def __init__(self,name='',age=''): self.name = name self.age = age def __repr__(self): return """Person(name='%s',age='%s')""" % ( self.name, self.age ) class MySimpleZODBApp: """ A simple application object that manages persistent object's of the 'Person' class. """ def __init__(self, file='Data.fs'): """ Create a database, connect to it and get the root object out of it. """ self.db = ZODB.DB(ZODB.FileStorage.FileStorage(file)) self.connection = self.db.open() self.root = self.connection.root() self.root.clear() if not len(self.root): self.root['billy'] = Person('Billy', 77) # normally Zope will handle transactions, # but in this special case, we need to # commit the transaction to save the new # persistent object print "get_transaction" get_transaction().commit() def addPerson(self, name, age): """ Adds a 'Person' to the database """ if self.root.has_key(name): raise 'PersonAllReadyExists', "They're allready there" else: self.root[name] = Person(name, age) get_transaction().commit() def delPerson(self, name): """ Deletes a 'Person' from the database """ if self.root.has_key(name): del self.root[name] get_transaction().commit() else: raise 'NoSuchPerson', 'Who?' def testwrite(self): """lots of silly objects""" for x in range(1000): if not (x % 100): # every 100 items # commit a sub transaction get_transaction().commit(1) self.root[x] = Person(str(x), x) # commit all sub-transactions just like normal # sub transactions get_transaction().commit() def testread(self): print self.root.keys() print self.root['billy'] if __name__ == '__main__': myapp = MySimpleZODBApp() myapp.testwrite() myapp.testread() -- ________________________________________________________________ Paul Stevens mailto:paul@nfg.nl NET FACILITIES GROUP PGP: finger paul@nfg.nl The Netherlands________________________________http://www.nfg.nl
participants (1)
-
Paul Stevens