For those who care, I wrote a more complete tutorial of how to do this
on my blog:

http://www.blog.pythonlibrary.org/?p=210

- Mike

On Jun 9, 11:35 am, Mike Driscoll <[email protected]> wrote:
> Drat it all! I forgot this import too:
>
> from tg.configuration import config
>
> On Jun 9, 11:30 am, Mike Driscoll <[email protected]> wrote:
>
> > Also note that the pylons_config module is imported like this:
>
> > from pylons import config as pylons_config
>
> > On Jun 9, 10:52 am, Mike Driscoll <[email protected]> wrote:
>
> > > By popular request, I'm sticking what I did on here:
>
> > > I used the pylons docs to figure out part of 
> > > this:http://www.pylonshq.com/docs/en/0.9.7/models/#multiple-engines
>
> > > Here are the files to change:
>
> > > #--------------
> > > # development.ini
>
> > > # create 2 or more sqlalchemy urls
>
> > > sqlalchemy.main.url = sqlite:///%(here)s/devdata.db
> > > sqlalchemy.other.url = sqlite:///%(here)s/devdata2.db
>
> > > # -------------------------------------------
>
> > > #--------------
> > > # app_cfg.py (which is in the config folder)
>
> > > # need to subclass AppConfig and
> > > # override setup_sqlalchemy
>
> > > from sqlalchemy import engine_from_config
> > > from pyretention.model import init_model
>
> > > class MyAppConfig(AppConfig):
> > >     def setup_sqlalchemy(self):
> > >         """Setup SQLAlchemy database engine."""
> > >         engineOne = engine_from_config(pylons_config,
> > > 'sqlalchemy.main.')
> > >         engineTwo = engine_from_config(pylons_config,
> > > 'sqlalchemy.other.')
> > >         config['pylons.app_globals'].engineOne  = engineOne
> > >         config['pylons.app_globals'].engineTwo  = engineTwo
> > >         # Pass the engine to initmodel, to be able to introspect
> > > tables
> > >         init_model(engineOne, engineTwo)
>
> > > base_config = MyAppConfig()
>
> > > # -------------------------------------------
>
> > > #--------------
> > > # model\__init__.py
>
> > > # Global session manager: DBSession() returns the Thread-local
> > > # session object appropriate for the current web request.
> > > maker = sessionmaker(autoflush=True, autocommit=False,
> > >                      extension=ZopeTransactionExtension())
> > > DBSession = scoped_session(maker)
>
> > > maker2 = sessionmaker(autoflush=True, autocommit=False,
> > >                       extension=ZopeTransactionExtension())
> > > secondSession = scoped_session(maker2)
>
> > > def init_model(engineOne, engineTwo):
> > >     """Call me before using any of the tables or classes in the
> > > model."""
>
> > >     DBSession.configure(bind=engineTwo)
>
> > >     secondSession.configure(bind=engineOne)
>
> > >     # you only need this metadata
> > >     #if you want to autoload a table
> > >     second_metadata = MetaData(engineOne)
> > > # -------------------------------------------
>
> > > Note that in websetup, there is a call to
>
> > > model.metadata.create_all(bind=config['pylons.app_globals'].sa_engine)
>
> > > So when you override AppConfig in app_cfg.py, you'll want to change
> > > one of these lines or hack websetup.py and any other references to
> > > sa_engine:
>
> > > config['pylons.app_globals'].engineOne = engineOne
> > > config['pylons.app_globals'].engineTwo = engineTwo
>
> > > to
>
> > > config['pylons.app_globals'].sa_engine = engineOne
>
> > > Hope that helps others.
>
> > > - Mike
>
> > > On Jun 9, 9:10 am, Mike Driscoll <[email protected]> wrote:
>
> > > > For the record, this was resolved. I didn't know how to set up the
> > > > second session object.
>
> > > > Thanks!
>
> > > > Mike
>
> > > > On Jun 5, 2:06 pm, percious <[email protected]> wrote:
>
> > > > > It's not too bad, but you have to do your own custom app setup, and
> > > > > modify your init_model stuff to create multiple transaction manager.
>
> > > > > app_cfg.py:
>
> > > > > from webapp.model import init_model
> > > > > from sqlalchemy import engine_from_config
> > > > > from tg.configuration import AppConfig, Bunch
> > > > > from pylons import config as pylons_config
>
> > > > > class MyAppConfig(AppConfig):
> > > > >     def setup_sqlalchemy(self):
> > > > >         """Setup SQLAlchemy database engine"""
> > > > >         users_engine = engine_from_config(pylons_config,
> > > > > 'sqlalchemy_users.')
> > > > >         samples_engine = engine_from_config(pylons_config,
> > > > > 'sqlalchemy_samples.')
> > > > >         config['pylons.app_globals'].sa_engine = users_engine
> > > > >         config['pylons.app_globals'].sa_users_engine = users_engine
> > > > >         config['pylons.app_globals'].sa_samples_engine =
> > > > > samples_engine
>
> > > > >         # Pass the engine to initmodel, to be able to introspect
> > > > > tables
> > > > >         init_model(users_engine, samples_engine)
>
> > > > > base_config = MyAppConfig()
> > > > > ...
>
> > > > > model/__init__.py:
>
> > > > > import model.users
> > > > > import model.samples
>
> > > > > from model.users.mappers import *
> > > > > from model.samples.mappers import *
>
> > > > > from zope.sqlalchemy import ZopeTransactionExtension
> > > > > from sqlalchemy.orm import scoped_session, sessionmaker
>
> > > > > # Global session manager.  DBSession() returns the session object
> > > > > # appropriate for the current web request.
> > > > > maker = sessionmaker(autoflush=True, autocommit=False,
> > > > >                      extension=ZopeTransactionExtension())
>
> > > > > DBSession = UsersDBSession = scoped_session(maker)
> > > > > maker3 = sessionmaker(autoflush=True, autocommit=False,
> > > > >                      extension=ZopeTransactionExtension())
>
> > > > > SamplesDBSession = scoped_session(maker3)
> > > > > from model.users.metadata import metadata as users_metadata
> > > > > from model.samples.metadata import metadata as samples_metadata
>
> > > > > def init_model(users_engine, samples_engine):
> > > > >     """Call me before using any of the tables or classes in the
> > > > > model."""
>
> > > > >     global UsersDBSession, SamplesDBSession, users_metadata,
> > > > > samples_metadata
>
> > > > >     UsersDBSession.configure(bind=users_engine)
> > > > >     SamplesDBSession.configure(bind=samples_engine)
>
> > > > >     users_metadata.bind = users_engine
> > > > >     samples_metadata.bind = samples_engine
>
> > > > > This is sort of an off-the cuff answer, we will provide a better one
> > > > > in the next documentation release.
>
> > > > > Come find me on IRC if you need some more help.
>
> > > > > cheers.
> > > > > -chris
>
> > > > > On Jun 4, 10:31 am, Mike Driscoll <[email protected]> wrote:
>
> > > > > > Hi,
>
> > > > > > According to Mark Ramm's blog, supporting multiple databases is
> > > > > > supposed to be easy 
> > > > > > (seehttp://compoundthinking.com/blog/index.php/2008/07/31/10-reasons-why-...).
> > > > > > So where is the documentation that says how to do it??
>
> > > > > > I "think" I need to put multiple sqlalchemy.url's in my
> > > > > > development.ini file. But where oh where do I set up the SA engines
> > > > > > at? The model's __init__ claims to support multiple databases too
> > > > > > using MetaData, but it doesn't show where to bind the engine unless
> > > > > > you're supposed to use the undocumented init_model function somehow.
>
> > > > > > I'm pretty sure the init_model came from Perkins. Maybe he can tell 
> > > > > > me
> > > > > > where to put my call to the function and how to set it up for 
> > > > > > multiple
> > > > > > databases?
>
> > > > > > That would be great!
>
> > > > > > Thanks,
>
> > > > > > Mike
>
> > > > > > On May 28, 12:47 pm, Mike Driscoll <[email protected]> wrote:
>
> > > > > > > Hi,
>
> > > > > > > I am having a little trouble wrapping my head around how to 
> > > > > > > configure
> > > > > > > my model's __init__.py file for multiple databases. I am working 
> > > > > > > on an
> > > > > > > application that accesses 3 databases and does reflection on 
> > > > > > > select
> > > > > > > tables from all three.
>
> > > > > > > I assume I need to comment out this line:
>
> > > > > > > metadata = DeclarativeBase.metadata
>
> > > > > > > and instead create three metadata instances based on MetaData(),
> > > > > > > correct?
>
> > > > > > > Finally, as I understand it, I can use the "init_model" function 
> > > > > > > to do
> > > > > > > the mapping for some of them, but I am not understanding where to
> > > > > > > create the engine object to pass to it. Also, once I have my 
> > > > > > > tables
> > > > > > > mapped in the function, what do I put in my real model file if
> > > > > > > anything?
>
> > > > > > > Hopefully that stuff makes sense. I am using Python 2.5 and TG2 
> > > > > > > in a
> > > > > > > virtualenv on Windows XP.
>
> > > > > > > Thanks!
>
> > > > > > > Mike
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" 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/turbogears?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to