I have many classes, so it's seems a better idea to use something like that
(but I don't know what exactly is this registry, and why it's a WeakRef
dict) :
binding = {cls: engine for cls in Base._decl_class_registry.values()}
If not, maybe I can use the second approach, overloading Session, but is
this safe ?
class BindSession(Session):
def get_bind(self, mapper=None, clause=None):
if mapper:
if issubclass(mapper.class_, SomeBase):
return some_engine
elif issubclass(mapper.class_, OtherBase):
return other_engine
# correct ?
return super().get_bind(mapper,clause)
Le mardi 6 novembre 2018 18:07:48 UTC+2, Mike Bayer a écrit :
>
> On Tue, Nov 6, 2018 at 9:41 AM <[email protected] <javascript:>> wrote:
> >
> > Hi,
> >
> > I'm using a schema with multiple DB, like :
> >
> > engine1 =
> create_engine("mysql://localhost/{db}?charset=utf8".format(db=db1))
> > engine2 =
> create_engine("mysql://localhost/{db}?charset=utf8".format(db=db2))
> >
> > Then I use automap and reflection to generate mapping of all classes
> needed.
> >
> > Sometime, I want to use classes from both databases, but I cannot bind
> my session directly with two engines.
> >
> > I noticed that I can use the Session `binds` argument to decide which
> class to bind to some engine, but I have many classes to include here, and
> this is somewhat error prone.
> >
> > Is there any solution to automate the binding definition against each
> class ? Or to bind a session directly to multiple engines ?
>
> you would use the "binds" argument as you saw in
>
> https://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.params.binds.
>
>
>
> as you noticed though, you have to tell the Session which classes map
> to which engine. So when you use automap, each time you reflect()
> for a particular engine, you need to gather all the classes that were
> generated for that call and add them to a dictionary, which you can
> then pass to session.binds.
>
> If you have some totally other way to tell the Session, given a class,
> which engine to use, you can also make your own method to do whatever
> you want and override it, by overriding get_bind:
>
> https://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session.get_bind
>
> . you probably don't need to do it this way but there's an example
> of how that looks at
>
> http://techspot.zzzeek.org/2012/01/11/django-style-database-routers-in-sqlalchemy/.
>
>
>
>
>
> >
> > Thank you
> >
> >
> > --
> > SQLAlchemy -
> > The Python SQL Toolkit and Object Relational Mapper
> >
> > http://www.sqlalchemy.org/
> >
> > To post example code, please provide an MCVE: Minimal, Complete, and
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
> description.
> > ---
> > You received this message because you are subscribed to the Google
> Groups "sqlalchemy" group.
> > To unsubscribe from this group and stop receiving emails from it, send
> an email to [email protected] <javascript:>.
> > To post to this group, send email to [email protected]
> <javascript:>.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.