[Zope-dev] Problems with ZODB and persistence
Emiliano Marmonti
emarmonti at siu.edu.ar
Thu Sep 18 15:26:40 EDT 2003
Hello all
Finally could find where and how to add indexes in the actual way (think
so). Now I have another 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 again.
Emiliano.
More information about the Zope-Dev
mailing list