solved this: here is the working solution http://stackoverflow.com/questions/8195300/assigning-specific-column-to-be-primary-key-when-reflecting-an-existing-table-wi/8211789#8211789 I had to call the table reflection form init_model and not from the class it self, changing something with the mapper etc..
On 14 נובמבר, 19:50, alonn <[email protected]> wrote: > I'm trying to connect my turbogears application to 2 db > 1. sqlite for all the turbogears stuff (users,groups, etc) > 2. mssql - to write to a certain table (but I can't use it for all of > the turbogears tables, other models etc - very specific write access) > > I followed the tutorial in the docs and also > those:http://blog.curiasolutions.com/2009/07/multiple-databases-in-turbogea...http://www.blog.pythonlibrary.org/2009/06/13/using-multiple-databases... > I commented the original sqlalchemy.url in development.ini and wrote > the sqlalchemy.first.url and sqlalchemy.second.url > I edited the app_cfg like this: > from tg.configuration import AppConfig,config > from pylons import config as pylons_config > from priorityagent.model import init_model > > import priorityagent > from priorityagent import model > from priorityagent.lib import app_globals, helpers > class MultiDBAppConfig(AppConfig): > def setup_sqlalchemy(self): > '''Setup SQLAlchemy database engine(s)''' > from sqlalchemy import engine_from_config > engine1 = engine_from_config(pylons_config, > 'sqlalchemy.first.') > engine2 = engine_from_config(pylons_config, > 'sqlalchemy.second.') > # engine1 should be assigned to sa_engine as well as your > first engine's name > config['pylons.app_globals'].sa_engine = engine1# different > tutorials state different things about commenting or uncommenting this > line out > config['pylons.app_globals'].sa_engine_first = engine1 > config['pylons.app_globals'].sa_engine_second = engine2 > # Pass the engines to init_model, to be able to introspect > tables > init_model(engine1, engine2) > > #base_config = AppConfig() > base_config = MultiDBAppConfig() > I added to model.__init__ as follows: > > maker2 = sessionmaker(autoflush=True, autocommit=False, > extension=ZopeTransactionExtension()) > DBSession2 = scoped_session(maker2) > > DeclarativeBase2 = declarative_base() > > metadata2 = DeclarativeBase2.metadata > and in the init_model: > DBSession.configure(bind=engine1) > DBSession2.configure(bind=engine2) > > metadata.bind = engine1 > metadata2.bind = engine2 > > I wrote the class that supposed to use the second db (mssql) as > followes: > # -*- coding: utf-8 -*- > """Sample model module.""" > > from sqlalchemy import * > from sqlalchemy.orm import mapper, relation > from sqlalchemy import Table, ForeignKey, Column > from sqlalchemy.types import Integer, Unicode, Boolean,String > #from pylons import config as pylons_config # added this while trying > to figure this out > > #from sqlalchemy.orm import relation, backref > > from priorityagent.model import DeclarativeBase2, DBSession2 # added > DBSession2 while trying to figure this out- it isn't in the tutorial > #from priorityagent.model import init_model,metadata2 # added this > while trying to figure this out > #engine2 = engine_from_config(pylons_config, 'sqlalchemy.second.') # > added this while trying to figure this out > # > #metadata2.bind = engine2 # added this while trying to figure this out > > class Activities(DeclarativeBase2): > __tablename__ = 'specific tablename'' > __table_args__= {'autoload':True > #,'autoload_with':engine2 # added this while > trying to figure this out - didn't need this when I had a standalone > sqlalchemy class doing autoload > } > > but something doesn't seem to work right - > when running paster setup-app or paster shell I get: > > sqlalchemy.exc.UnboundExecutionError: No engine is bound to this > Table's MetaDat > a. Pass an engine to the Table via autoload_with=<someengine>, or > associate the > MetaData with an engine via metadata.bind=<someengine> > > when I add the 'autload_with':engine2 I get an error message It > doesn't know engine2 > > when I added: > from pylons import config as pylons_config > engine2 = engine_from_config(pylons_config, 'sqlalchemy.second.') > I get: > File "D:\Python27\learn\agent\agent\lib\site-packages > \sqlalchemy-0.7.3-py2.7.egg\sqlalchemy\engine\__init__.py", line 297, > in engine_from_config > url = opts.pop('url') > KeyError: 'url' > > I thought maybe editing schema.py with the sa_engine would be needed > so I added there: > > model.metadata.create_all(bind=config['pylons.app_globals'].sa_engine_first) > > model.metadata2.create_all(bind=config['pylons.app_globals'].sa_engine_second) > > but it didn't make and difference > > you can follow my different shots at this problem in the comments but > I'm practically in the dark here with turbogears internals and very > vague docs.. > > I suspect this is connected to not having an __init__ method so that > model.__init__ maybe isn't called? but I don't really need one here - > I'm using autoloading on a preexisting table > > when I used a similiar class directly with sqlalchemy without > turbogears2, (add the engine with the connection url, import the > session , etc) it does work but that doesn't help me too much, since I > want this class to be a part of a turbogears application. > > I'll be glad for any help/hint about this -- 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.

