[Zope] ZODB Persistence problem
Emiliano Marmonti
emarmonti at siu.edu.ar
Thu Sep 18 20:48:42 EDT 2003
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.
More information about the Zope
mailing list