On Dec 3, 2009, at 2:39 PM, Victor Olex wrote: > By database we refer to a separate instance (could be on another > server) of equvalent database i.e. production and development > environments. > > Using sqlalchemy.ext.declarative, what would be a correct pattern to > enable one model to connect to two equivalent databases? > > Consider: > > --- model.py --- > Base = declarative_base() > metadata = Base.metadata > > class MyTable(Base): > __tablename__ = 'my_table' > id = Column(Integer, primary_key=True, nullable=False) > description = Column(CHAR(length=100), nullable=False) > > _Session = sessionmaker() > > def make_session(uri): > metadata.bind = engine > session = Session(bind=engine) > return session > > --- program.py -- > import model > > """copy some data between databases""" > srcdb = model.make_session(srcdb_uri) > destdb = model.make_session(srcdb_uri) > > items = srcdb.query(model.MyTable).all() > > for i in items: > destdb.merge(i) > > destdb.commit() > --- > > We have two distinct sessions bound to to different databases but > because metadata is a module level variable it gets rebound to the > database of last call.
never bind your metadata to an engine if you do not require this functionality. it is an entirely optional convenience feature. > > Also I am somewhat unclear on the difference between metadata binding > to engine and session binding to engine, especially when they end up > different. What is relevance of MetaData binding? it is discussed here: http://www.sqlalchemy.org/docs/05/metadata.html#binding-metadata-to-an-engine-or-connection in the upcoming 0.6 documentation, I've expounded upon this a bit: http://www.sqlalchemy.org/docs/06/metadata.html#binding-metadata-to-an-engine-or-connection Should you use bind ? It’s probably best to start without it. If you find yourself constantly needing to specify the same Engine object throughout the entire application, consider binding as a convenience feature which is applicable to applications that don’t have multiple engines in use and don’t have the need to reference connections explicitly. It should also be noted that an application which is focused on using the SQLAlchemy ORM will not be dealing explicitly with Engine or Connection objects very much in any case, so it’s probably less confusing and more “future proof” to not use the bind attribute. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.