Hi GIovanni,

Two possibilities I see:

1. It is a character encoding issue, perhaps try changing the database
to have an attribute:

class Database(BaseDatabase):
    _engine_args = {'charset':'utf8', 'convert_unicode':True}

(See the reference here:
http://www.sqlalchemy.org/docs/04/sqlalchemy_databases_mysql.html)

Maybe the discussion here could help too:
http://www.google.co.uk/url?sa=t&source=web&ct=res&cd=2&url=http%3A%2F%2Fgroups.google.com%2Fgroup%2Fsqlalchemy%2Fbrowse_thread%2Fthread%2F9aa7d77b1b9431fd%2F34b8debbfee51043&ei=qWO9SMOGHoycQPGH6aYI&usg=AFQjCNEK8_cv_TyZ1QsnJkFiLnfyrgYb1A&sig2=PBDzDrH8Ug-9IIvZ74cjFw

2. Have you set the correct key type on the container class:

class CityTownFolder(TableFolder):
    implements(
        tin.IIntegerItemKey, # marker interface to indicate table has
a string primary key
        )

Hope that helps,

Laurence

2008/9/2 Giovanni Toffoli <[EMAIL PROTECTED]>:
> Hi all,
>
> I've made some progress in using the collective.tin toolkit including
> - MySQL_python
> - SQLAlchemy 0.4.7p1
> - zope.sqlalchemy 0.3
> - collective.lead 1.1dev-r66822
> - collective.mercury 0.1dev-r66833
> - collective.tin 0.3dev
>
> Among other things I've
> - migrated to MySql 5.0.41 a legacy MsAccess database, comprising many
> tables
> - constructed and executed a buildout.cfg starting from the base buildout
> for Plone 3.1.4
> - created the skeleton of an application product fulbright.grants, as a
> development egg
> - succeded to generate, for most of the tables, with collective.mercury, the
> modules db.py, automodel.py and autointerfaces.py
>
> The schema of the original database is quite simple. It includes:
> - a master table representing grants awarded by an institution
> - a dozen auxiliary tables used to enumerate and code allowed values for the
> columns of the master table.
> Each table has a numeric primary key (INT) and a number of VARCHAR colums.
>
> I've started, in the "model.py" module of my product to define a couple of
> classes for each of the auxiliary tables.
> E.g., in the case of the table "full_comuni", enumerating cities/towns (with
> country, region, province information):
> - the container class (a folderish object in the ZODB) "CityTownFolder"
> - the item class (no ZODB stub) "full_comuniTable" (= CityTown).
>
> I've succeded to define and use the above couple of classes (and to create
> an instance of the container class) for 2 auxiliary tables in MySql.
> The items inside are listed by Plone in the default view of the container
> object and can also be edited.
>
> But, whenever a table includes a value with an accented letter (from the
> Italian alphabet), I get an exception such as:
>  KeyError: '16578'
> where the value shown is the value of the primary key of a row containing a
> field value with an accented letter.
> The KeyError exception is raised by the "__getitem__" method of the class
> RDBMSContainer in collective.tin/collective/tin/container.py.
> I've put a pdb.trace() instruction slightly upstream, in the "get" method of
> the same class, just after the "except ValueError:" line.
>
> I enclose, at the end of this post:
> - the transcript of my debugging
> - some configuration information
> - the complete error log.
>
> I am 99% certain that the problem is related to some bad handling of the
> non-ASCII characters (the accented letters).
> But I cannot understand
> - if some configuration of my software or of the MySql database isn't ok
> - if there is some bug in the underlying software and where (collective.tin,
> sqlalchemy, ..)
> - how to investigate the presumed bug.
>
> I would greatly appreciate any suggestions.
>
> Thank you very much in advance, Giovanni Toffoli
>
> ==========
> This is the transcript of my debugging:
>
>> c:\plone3\plone3\src\collective.tin\collective\tin\container.py(95)get()
>
> -> return default
> (Pdb) l
> 90                 clause = sql.and_(*(col==key for col, key in
> zip(self.keycolumns, keys)))
> 91                 returned = self.query.filter(clause).all() # this should
> only ever be one item long
> 92             except ValueError:
> 93                 import pdb
> 94                 pdb.set_trace()
> 95  ->             return default
> 96             if not returned:
> 97                 return default
> 98             assert len(returned) == 1, "Unexpectedly returned more than
> one row"
> 99             ob = returned[0]
> 100             #if getattr(ob, '_v__object_deleted__', None): # maybe later
> (Pdb) p clause
> <sqlalchemy.sql.expression._BinaryExpression object at 0x07320F90>
> (Pdb) p self.query.filter(clause)
> <sqlalchemy.orm.query.Query object at 0x07323DD0>
> (Pdb) objects = self.query.filter(clause).all()
> (Pdb) p objects
> [<fulbright.grants.model.full_comuniTable object at 0x0739A1B0>]
> (Pdb) object = objects[0]
> (Pdb) p object
> <fulbright.grants.model.full_comuniTable object at 0x0739A1B0>
> (Pdb) p object.COMU_COD
> 16578L
> (Pdb) p object.COMU_PROV
> u'AG'
> (Pdb) p object.COMU_DESCR
> None
> (Pdb) p object.comu_regio
> None
> (Pdb) p object.NAZIONE
> None
>
> Some explanations:
> - COMU_COD is the primary key of the row going in error
> - COMU_PROV is a 2 characters province code
> - COMU_DESCR is the field whose value includes an accented letter for this
> row
> the other 2 fields following in the database have not-null values with
> ASCII-only characters.
> All the data in the database appear ok from the MySql Administrator tool.
>
> ==========.
> Some configuration info:
> - Windows XP Service Pack 2
> - python 2.4.4
> - Zope 2.10.6-final
> - Plone 3.1.4
> - MySql 5.0.41; all tables: charset: utf8, collation: utf8_general_ci
>
> =========
> Error log:
>
> Traceback (innermost last):
>  Module ZPublisher.Publish, line 119, in publish
>  Module ZPublisher.mapply, line 88, in mapply
>  Module ZPublisher.Publish, line 42, in call_object
>  Module Products.CMFFormController.ControllerPythonScript, line 161, in
> __call__
>  Module Shared.DC.Scripts.Bindings, line 313, in __call__
>  Module Shared.DC.Scripts.Bindings, line 350, in _bindAndExec
>  Module Products.zdb.monkeypatch, line 61, in monkey_exec
>  Module Products.PythonScripts.PythonScript, line 327, in _exec
>  Module None, line 32, in createObject
>  - <ControllerPythonScript at /fulbright_db/fulbright/createObject used for
> /fulbright_db/fulbright/tabelle>
>  - Line 32
>  Module Products.ATContentTypes.lib.constraintypes, line 281, in
> invokeFactory
>  Module Products.CMFCore.PortalFolder, line 315, in invokeFactory
>  Module Products.CMFCore.TypesTool, line 716, in constructContent
>  Module Products.CMFCore.TypesTool, line 276, in constructInstance
>  Module Products.CMFCore.TypesTool, line 458, in _constructInstance
>  Module OFS.ObjectManager, line 326, in _setObject
>  Module zope.event, line 23, in notify
>  Module zope.component.event, line 26, in dispatch
>  Module zope.component._api, line 130, in subscribers
>  Module zope.component.registry, line 290, in subscribers
>  Module zope.interface.adapter, line 535, in subscribers
>  Module zope.component.event, line 33, in objectEventNotify
>  Module zope.component._api, line 130, in subscribers
>  Module zope.component.registry, line 290, in subscribers
>  Module zope.interface.adapter, line 535, in subscribers
>  Module OFS.subscribers, line 107, in dispatchObjectWillBeMovedEvent
>  Module zope.app.container.contained, line 181, in dispatchToSublocations
>  Module OFS.subscribers, line 87, in sublocations
>  Module collective.tin.container, line 82, in <generator expression>
>  Module collective.tin.container, line 108, in __getitem__
> KeyError: '16578'
>
>
>

_______________________________________________
Product-Developers mailing list
[email protected]
http://lists.plone.org/mailman/listinfo/product-developers

Reply via email to