1. ホーム
  2. python

[解決済み] SqlAlchemy Python マルチデータベース

2022-02-19 20:23:32

質問

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

解決方法は?

こんにちは、あなたはこれを達成することができます次のようになります。

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

私は、サーバーに2つのデータベースと2つのテーブルを持っています。その後、クエリを作成中に特定のデータベース接続をルーティングするためにルーティングクラスを使用することができます。

  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で複数のデータベースを使用できるようにするものでした。