I like the proposal, anything that simplifies the whole context thing is
great! do you think your proposal will work with the assignmapper extension?
Jose
Michael Bayer wrote:
> at Mike Orr's prodding, ive worked up a SQLAlchemy context object
> based on his proposal for a facade that deals with the various session
> (context)/engine/metadata mixtures. I think this would be a good
> idea for the very reason that it encapsulates all the details of how
> engines/metadata/session/etc get created and used. right now we have
> tutorials and such all throwing out BoundMetaDatas and Sessions with
> bind_to's and a lot of mixing up of paradigms. by putting it all
> inside a single facade, nobody has to make those decisions anymore if
> they dont want to. the facade would be configurable to support a few
> different operational paradigms, including engines bound to tables,
> or engines bound to sessions...each of which has its pros and cons
> depending on the type of app youre writing (i.e. one app with one
> database, one app with multiple databases for different objects, one
> app with multiple databases for different use cases (e.g. separate
> readonly/write db's), multiple apps on multiple databases, multiple
> apps sharing common tables across multiple databases). by default it
> would internally bind engines to metadatas which is the most flexible
> configuration for a single application that may persist different
> model classes to different dbs.
>
> this object would just give you everything you need: metadata,
> engine, session. how they got constructed, which one connects to
> what, you dont care. because really, most people dont. qualified
> method accessors engine/metadata for alternate connection names would
> be provided. multiple applications that talk to different
> tablesets, i.e. for middleware that has its own deal going on, just
> makes its own SAContext. this probably would obviate the need for a
> "global engine registry" at all (though im not sure).
>
> from pylons.database import SAContext
>
> sac = SAContext() # connects to engine in the .ini file by default
>
> sac = SAContext(url='sqlite://', engine_args={}) # or send a url,
> args in
>
> # create a table. metadata is a BoundMetaData to the default engine.
> users = Table('users', sac.metadata, Column(...)...)
>
> # alternatively, we could have a table creation function on the
> object w/o the metadata argument (opinions?)
> users = sac.define_table('users', Column(...)...)
>
> # add extra engine
> sac.add_engine('pgconn', url='postgres://', engine_args={})
>
> # table on alt engine. metadata is a BoundMetaData to the 'pgconn'
> engine.
> remote_users = Table('remote_users', sac.get_metadata('pgconn'),
> Column(...)...)
>
> # mappers can bind to the sessioncontext via the SAContext directly
> # (its got a SessionContext inside, sends out SessionContext.ext out
> # via "ext")
> mapper(User, users, extension=sac.ext)
> mapper(RemoteUser, remote_users, extension=sac.ext)
>
> # query accessor
> sac.query(Users).filter_by(...).list()
>
> # session. gets pulled from the SessionContext. note you never deal
> # with the context itself.
> # session doesnt even have a bind_to, its just using the engines for
> # each table it gets.
> sac.session.save(User())
> sac.session.save(RemoteUser())
>
> # that way this statement saves each user to its correct DB without
> # any issues.
> sac.session.flush()
>
> if we get everyone on a simple object like this, then we can plug in
> strategies for other scenarios, build up clustering strategies, etc.
>
>
>
>
>
>
> >
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---