[Zope] problem with commits in SQLAlchemyDA

Maric Michaud maric at aristote.info
Mon Aug 17 09:54:10 EDT 2009


Hi all,

I wanted to use SQALchemyDA with a standalone Zope 2.11 (we only depends 
on CMFCore).

i tried to get it up using easy_install, which is pretty 
straightforward, once removed the incompatible zope.component package 
needed in the dependencies.

It ends up with the following installed packages (skipping zope 3 
components) :
zope.sqlalchemy-0.4-py2.4.egg
z3c.sqlalchemy-1.3.10.1-py2.4.egg
SQLAlchemy-0.5.5-py2.4.egg
Products.SQLAlchemyDA-0.4.1-py2.4.egg

At first glance, this works well, but the DA actually can't manage to 
commit any sql requests (I try only for insert in Mysql and postgres but 
I'm sure it's always true).

This is quite an unexpectable behavior for a DA.

I think the problem is related to this thread I found on tg-trunk 
newsgroup :

http://www.mail-archive.com/turbogears-trunk@googlegroups.com/msg07302.html

There is a misleading comment in the docstring of 
zope.sqlalchemy.datamanager.join_transaction speaking of a 
DirtyAfterFlush SessionExtension, which I never seen except in plone code.

In the last I finally manage to make it work by monkey patching 
SQLAlchemyDA itself this way :


try :
     from Products.SQLAlchemyDA import da
     from z3c.sqlalchemy import getSAWrapper, createSAWrapper
     if '0.4.1' in da.__file__ and not hasattr(da.SAWrapper,
                               '_patched__wrapper_property') :
         da.SAWrapper._patched__wrapper_property = da.SAWrapper._wrapper

         def _always_invalidated_wrapper(self):
             """The property '_wrapper' patched by CFENet to correct what
             seems to be a bug in SQLAlchemyDA which prevents any
             commit."""
             from zope.sqlalchemy.datamanager import STATUS_INVALIDATED
             if self.dsn:
                 try:
                     return getSAWrapper(self.util_id)
                 except ValueError:
                     return createSAWrapper(
                       self.dsn, forZope=True,
                       transactional=self.transactional,
                       engine_options={'convert_unicode' : 	
                                             self.convert_unicode,
                                       'encoding' : self.encoding},
                       extension_options={'initial_state': # the whole
                                                        # point is here
                                             STATUS_INVALIDATED},
                       name=self.util_id)
             return None

         da.SAWrapper._wrapper = property(_always_invalidated_wrapper)

except ImportError :
     pass


Anyone has any insights about this problem, any comments on my solution, 
did it have been reported and corrected, or am I simply missing something ?


-- 
_____________

Maric Michaud



More information about the Zope mailing list