[Zope-dev] Re: zope.sqlalchemy
Laurence Rowe
l at lrowe.co.uk
Wed May 7 13:29:33 EDT 2008
Michael Bayer wrote:
>
> On May 7, 2008, at 7:08 AM, Martijn Faassen wrote:
>
>> Hi there (especially Christian),
>>
>> I think we can work with explicits saves. In many cases the user won't
>> have to worry about it anyway as the container object will do it for
>> them (besides making the relation), or this 'query container' we spoke
>> of will do it for them (but just the 'save' bit).
>>
>> One point is that the scoped session approach itself doesn't work very
>> well for using multiple databases in the same app. We could consider
>> passing the session along in the containers during object graph
>> wakling (or traversal) so an app can easily traverse into multiple
>> databases. I'm not sure whether we can make the ORM do this for us
>> though; does it initialize the mapping with a session?
>>
>
> SQLAlchemy's Session does support multiple engine binds itself, which
> most easily can be associated with particular mapped classes (i.e.
> vertical partitioning), so that a single session (or a scoped_session)
> can read and write data to the appropriate tables transparently
> (although things like joins across multiple databases will raise
> errors). Theres a horizontally-partitioning version of Session as well
> which obviously has a lot more caveats.
>
> Using multiple sessions, one per DB is a valid approach as well. I'm
> not sure if Grok has other things going on when mulitple DBs are in use
> but SA's multi-bind capability is something to be aware of.
I'm thinking more about having the same classes mapped to different
databases at different points in the application. Imagine a
departmental address book app. Intstances of the departmental address
book are created for each department, each with a different databases:
http://addressbook/sales -> postgres:///sales
http://addressbook/engineering -> postgres:///engineering
The way I imagine this working is to have a proxy engine object that
looks up the real engine through a local utility. Each application would
be a `site` and capable of local utility registrations. /sales would
have Engine('postgres:///sales') registered and /engineering
Engine('postgres:///engineering').
Only a single ScopedSession would be required. This would be bound to
proxy that performs the utility lookup. So when in the /sales context
the proxy would point to the sales engine and when in the /engineering
context to the engineering engine.
The limitation of this approach is that it would not be possible to mix
objects from /sales and objects from /engineering into the same
transaction. So really we need a session per application instance.
Perhaps this can be achieved through a custom scoping function:
def scopefunc():
return thread.get_ident(), id(zope.component.getSiteManager())
Laurence
More information about the Zope-Dev
mailing list