Hello all I'm trying to do an application that handles it own ZODB database for storing large hierarcichal data. The abstractions and the db access are in external method and I use DTML for querying and receiving data to store. I have seen some examples like that about using ZODB from outside of Zope. I have integrated the database with a catalog to search inside it. Now I have a problem that have no idea how to fix it. Could add objects into a ZODB separate database, could add the catalog and the index, but when the database has one element, with every operation (inclusive opening it) this message appears from Zope: 'App.PersistentExtra' module has no attribute 'Autor'
From Python
File C:\Archivos de programa\Zope\lib\python\ZODB\Connection.py, line 534, in etstate File C:\Archivos de programa\Zope\lib\python\ZODB\Connection.py, line 178, in_persistent_load (Info: ('\x00\x00\x00\x00\x00\x00\x00\x0e', ('App.PersistentExtra', 'Autor'))) File C:\Archivos de programa\Zope\lib\python\ZODB\Connection.py, line 138, in __getitem__ (Info: ('\x00\x00\x00\x00\x00\x00\x00\x0e', '((U\x13App.PersistentExtraq\x01U\x05Autorq\x02tq\x03Nt.}q\x04(U\x02idq\x05U\x0822596451q\x06U\x04nameq\x07U\x0f Juana Silviaq\x08U\robservacionesq\tU\x0bpruebaq\nu.')) File C:\Archivos de programa\Zope\lib\python\ZODB\DB.py, line 122, in _classFa ctory AttributeError: 'App.PersistentExtra' module has no attribute 'Autor' Simply, I have no idea what is happening, have searched over App.PersistentExtra but...what is???? Somebody knows where could I find an example (that works and is updated) for doing this kind of tasks? My code is: ----------------------------- import sys import ZODB import Persistence from Persistence import Persistent from ZODB.FileStorage import FileStorage from Products.ZCatalog.Catalog import Catalog from Products.PluginIndexes.FieldIndex.FieldIndex import FieldIndex class Autor(Persistent): id='' name='' observaciones='' def __init__(self,id,nombre,comments): self.name = nombre self.id = id self.observaciones = comments def setName(self,nombre): self.name = nombre def setId(self,id): self.id = id def setObs(self,comments): self.observaciones = comments def getName(self): return self.name def getId(self): return self.id class Autores: def __init__( self, file='dcAuthor.fs' ): self.file= file self.db = ZODB.DB( FileStorage( file ) ) self.co = self.db.open() self.root= self.co.root() if self.root.has_key( 'cat' ): self.cat= self.root['cat'] else: self.cat = Catalog() ### This is, how I get it to work self.cat.aq_parent= self.root self.root['cat']= self.cat ### Add indexes to the Catalog-Class ### The names must match the fields of the Person-Class! indice = FieldIndex('id') self.cat.addIndex('id',indice ) otroIndice = FieldIndex('name') self.cat.addIndex('name' ,otroIndice ) ### self.cat.addIndex('observaciones','FieldIndex' ) get_transaction().commit() def setAutor( self, autor ): uid= id( autor ) self.root[uid]= autor print "Guardada como:"+str(uid) ### Let the Catalog know from this object self.cat.catalogObject( autor, uid ) get_transaction().commit() def searchAutor( self, **kw ): r= self.cat.searchResults( kw ) paths= self.cat.paths root = self.root k= [] for i in r: id= i.data_record_id_ k.append( root[paths[id]] ) return k def close ( self ): self.db.close() def AddAutor(nombre,documento,obs): autor = Autor(documento,nombre,obs) autores = Autores() autores.setAutor(autor) autores.close() def GetAutor(expresion): autores = Autores() listaAutores=autores.searchAutor(name=expresion) autores.close() listaretorno=[] for au in listaAutores: listaretorno.append(au.getName()) return listaretorno ---------------------------------------- I've seen that if I no close() the database, only obtain Error 500 from the server. GetAutor and AddAutor are called from DTML. Well, thanks a lot. Emiliano.
Emiliano Marmonti wrote at 2003-9-18 21:48 -0300:
... Now I have a problem that have no idea how to fix it. Could add objects into a ZODB separate database, could add the catalog and the
index, but when the database has one element, with every operation (inclusive opening it) this message appears from Zope:
'App.PersistentExtra' module has no attribute 'Autor'
You screwed up your ZODB... I have no idea how you had been able to do that.
... (Info: ('\x00\x00\x00\x00\x00\x00\x00\x0e', '((U\x13App.PersistentExtraq\x01U\x05Autorq\x02tq\x03Nt.}q\x04(U\x02idq\x05U\x0822596451q\x06U\x04nameq\x07U\x0f
Juana Silviaq\x08U\robservacionesq\tU\x0bpruebaq\nu.')) File C:\Archivos de programa\Zope\lib\python\ZODB\DB.py, line 122, in _classFa ctory AttributeError: 'App.PersistentExtra' module has no attribute 'Autor'
Somehow, you stored an object into the ZODB the class of which was "App.PersistentExtra.Autor" As the name suggests, there is no class "Autor" (seems not to be English) in "App.PersistentExtra". When you try to load the object, Zope does indeed not find it.
Simply, I have no idea what is happening, have searched over App.PersistentExtra but...what is???? Somebody knows where could I find an example (that works and is updated) for doing this kind of tasks?
The ZODB guide might help you. Of course, it does not contain an example for precisely your task. Moreover, zodb-dev@zope.org might be more adequate for your type of questions.
My code is: ----------------------------- ... class Autor(Persistent): ...
Somehow, you succeeded to let Python think this class were defined in "App.PersistentExtra". I have no idea how you could do that... Dieter
Dieter Maurer wrote:
Somehow, you succeeded to let Python think this class were defined in "App.PersistentExtra".
I have no idea how you could do that...
class Autores: def __init__( self, file='dcAuthor.fs' ): self.file= file self.db = ZODB.DB( FileStorage( file ) ) self.co = self.db.open() self.root= self.co.root() I'm pretty sure this code is suicidal ;-) Chris
participants (3)
-
Chris Withers -
Dieter Maurer -
Emiliano Marmonti