SqlAlchemy Python多个数据库

时间:2015-01-30 15:09:33

标签: python sqlalchemy

我使用SqlAlchemy访问多个数据库(在同一台服务器上)。我当前的连接字符串如下

connect_string = "mssql+pyodbc://{0}:{1}@{2}/{3}".format(USERNAME_R, PASSWORD_R, SERVER_R, DATABASE_R)
engine = create_engine(connect_string)
session = sessionmaker(bind=engine)()
Record = declarative_base(engine)

如何修改此声明以便能够连接到同一服务器上的多个数据库(例如DATABASE1& DATABASE2)。这似乎指向了正确的方向,但它不是很清楚,我不确定它是否特定于Flask:

https://pythonhosted.org/Flask-SQLAlchemy/binds.html

3 个答案:

答案 0 :(得分:1)

嗨,您可以使用follwing来实现。

engines = {
    'drivers':create_engine('postgres://postgres:admin@localhost:5432/Drivers'),
    'dispatch':create_engine('postgres://postgres:admin@localhost:5432/dispatch')
}

我在服务器和两个表中有两个数据库,之后可以在查询的同时使用Routing类路由特定的数据库连接:

  class RoutingSession(Session):
    def get_bind(self, mapper=None, clause=None):
        if mapper and issubclass(mapper.class_, drivers):
            return engines['drivers']
        elif self._flushing:
            return engines['dispatch']

现在您可以相应地触发查询,例如,首先您需要使用以下方式进行会话:

Session = sessionmaker(class_=RoutingSession)
session = Session()
driverssql = session.query(drivers).all()

这是您可以在sqlalchemy中使用多个数据库

答案 1 :(得分:1)

SQLAlchemy官方文档现在提供了更多的见识,比其余答案中提供的策略要多得多。

只需查看以下链接:

答案 2 :(得分:0)

(由于时间不够,手写的答案很抱歉。)

不要将引擎绑定到declarative_base。继承表单declarative_base()

而是在创建会话时将特定引擎传递给sqlalchemy.orm.sessionmaker。为不同的引擎创建不同的事务工厂(sessionmaker返回)。在您的查询中,使用.with_session绑定到特定会话,从而绑定到特定引擎。