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
-~----------~----~----~----~------~----~------~--~---