[Zope-dev] Re: straighting out the SQLAlchemy integration mess

Laurence Rowe l at lrowe.co.uk
Wed Apr 9 09:15:38 EDT 2008


The transaction manager here:

http://svn.plone.org/svn/collective/collective.lead/branches/elro-tpc/collective/lead/tx.py

Has support for TPC and savepoints. It is tested and works. The only 
issue with sqlite is that the default in the branch is to use two-phase 
commit and sqlite does not support this. Apart from that the module is 
completely self contained.

The public interfaces to it is the two functions at the bottom, 
join_transaction and dirty_session. The idea of the dirty_session stuff 
is to prevent unnecessary commits when data is only read. Session writes 
  trigger the 'dirtying' automatically with a SessionExtension:

http://svn.plone.org/svn/collective/collective.lead/branches/elro-tpc/collective/lead/database.py

The downside of this approach is that the when you interact with the 
connection directly to modify data you must call dirty_session yourself. 
If this is a problem for you then you may set up the transaction to be 
in the dirty state initially.

Thread based session management is used (scoped_session). There is 
fairly extensive testing of this and the transaction support here:

http://svn.plone.org/svn/collective/collective.lead/branches/elro-tpc/collective/lead/tests.py

I think it would be worth factoring out the threaded session support as 
well as the transactions.

@Christian:

I'm not quite sure what you mean by:

- Database triggers as events

I don't see how you could reasonably get a database trigger on the db 
server to instantiate a zope event on the db client. Perhaps the 
database could be persuaded to make a request to a URL on a trigger, but 
this seems a bit slow and maybe not a great solution.

- Making SA 0.4 work with security proxies

I don't know anything about security proxies in zope 3, but surely this 
is just a matter of what the base class is / the container 
implementation? I don't see why an SQL Alchemy mapped object would be 
any different to any other object.

@Martin:

Should one phase commit be set as the default to make it easier to work 
with sqlite (and mssql)? Probably yes.

Should the default be for sessions to start out `active` or `dirty`? If 
they start out `dirty` then existing 1.0 code should work as before.

It'll probably be next week before I manage to get this tidied up and 
merged back to trunk.

@everyone:

If we can all agree to use the same basic session and transaction 
management then we should probably push for it to be included as a 
sqlalchemy extension module.


Laurence

Martin Aspeli wrote:
> Martijn Faassen wrote:
>> Hi there,
>>
>> [I originally picked this up on a thread on zope3-users, but this 
>> deserves its own thread here]
>>
>> There are at least three approaches to SQLAlchemy integration with Zope:
>>
>> * z3c.zalchemy (Christian Theune)
>>
>> * z3c.sqlalchemy (Andreas Jung)
>>
>> * collective.lead (Laurence Rowe)
>>
>> All of these are in various states of brokenness. z3c.zalchemy doesn't 
>> work with SQLAlchemy trunk. collective.lead works with it, but only if 
>> you check out a particular branch, and not with sqlite. Quite possibly 
>> z3c.sqlalchemy has a release that actually works. One out of three is 
>> not bad... :)
>>
>> Then there's also mentions about WSGI-based integration, and I think 
>> in Plone, Alchemist probably also does its own integration...
>>
>> There must be a reason for this proliferation of approaches. What is 
>> it?   We all get along, don't we? I know that the various packages are 
>> taking code and approaches from each other too.
>>
>> Can't we work together more and at least come up with *one* package 
>> that works? Perhaps factor out some low-level commonality than then 
>> all share? Criticize one of the other packages until you're satisfied, 
>> and then retire your own package perhaps? I know the various packages 
>> add on their own approaches to configuration and might offer higher 
>> level container approaches. Those could be in different packages, 
>> sharing a foundation.
>>
>> In the end, I hope we will end up with just *one* integration layer, 
>> that is released, that works with Zope 2 and Zope 3 and a recent 
>> release of SQLAlchemy, that is documented, and that people know about. 
>> We can then offer packages on top of this that offer extra features.
> 
> I'm all for one integration layer, even though I spurred one of the 
> above (collective.lead). I would ask that we be very conservative, 
> though. collective.lead wants to provide:
> 
>  - automatic transaction integration with ZODB transactions
>  - an easy way to register your database connections
>  - an easy way to look those up as utilities and get an ORM session
> 
> Everything else (e.g. Zope ORM integration, configuration abstractions, 
> etc) should be in some other package.
> 
> collective.lead has a reasonable degree of traction in the Plone 
> universe, at least, but should work just fine with plain Zope 3. We have 
> other things that work on top it (mercury, rope, probably others).
> 
> The branch that works with trunk also has some carefully worked out TPC 
> support, which is difficult to get right, though I'm disappointed that 
> we seem to have broken sqlite integration. Hopefully it's an easy fix, 
> though.
> 
> I'm CC'ing Laurence to ask:
> 
>  - can we get a release soon?
>  - can we fix the sqlite integration?
> 
> Cheers,
> Martin
> 



More information about the Zope-Dev mailing list