sql >> データベース >  >> RDS >> Mysql

Flask-SQLAlchemy-複数のデータベースへのオンザフライ接続

    1つのデータベース

    エンジンは、接続プールを使用できるようにするものです。デフォルトでは、リクエスト間で接続を維持します。基本的な使用法(scoped_sessionのような派手なものはありません またはsessionmaker )は次のようになります:

    engine = create_engine(...)
    
    @app.route(...)
    def foo():
        session = Session(bind=engine)
        try:
            session.query(...)
            session.commit()
        finally:
            session.close()
        return ""
    

    これに加えて、scoped_sessionを追加できます およびsessionmaker

    engine = create_engine(...)
    Session = sessionmaker(bind=engine)
    session = scoped_session(Session, scopefunc=...)
    
    @app.route(...)
    def foo():
        try:
            session.query(...)
            session.commit()
        finally:
            session.close()
        return ""
    

    flask-sqlalchemy これらすべてを提供することで、あなたの生活が楽になります:

    db = SQLAlchemy(app)
    
    @app.route(...)
    def foo():
        db.session.query(...)
        db.session.commit()
        return ""
    

    複数のデータベース

    この概念を複数のデータベースに簡単に拡張できます:

    engine1 = create_engine(...)
    engine2 = create_engine(...)
    
    @app.route(...)
    def foo():
        session = Session(bind=choose_engine_for_user())
        try:
            session.query(...)
            session.commit()
        finally:
            session.close()
        return ""
    

    scoped_sessionを追加する場合 およびsessionmaker

    engine1 = create_engine(...)
    engine2 = create_engine(...)
    Session1 = sessionmaker(bind=engine1)
    Session2 = sessionmaker(bind=engine2)
    session1 = scoped_session(Session1, scopefunc=...)
    session2 = scoped_session(Session2, scopefunc=...)
    
    @app.route(...)
    def foo():
        session = choose_session_for_user()
        try:
            session.query(...)
            session.commit()
        finally:
            session.close()
        return ""
    

    多くのデータベースがある場合、これは少し面倒になります。その場合、すべてのエンジンとセッションを追跡するためにレジストリクラスを作成する必要があります。

    class SessionRegistry(object):
        _registry = {}
    
        def get(self, url, **kwargs):
            if url not in self._registry:
                engine = create_engine(url, **kwargs)
                Session = session_maker(bind=engine)
                session = scoped_session(Session, scopefunc=...)
                self._registry[url] = session
            return self._registry[url]
    
    registry = SessionRegistry()
    
    @app.route(...)
    def foo():
        session = registry.get(...)
        try:
            session.query(...)
            session.commit()
        finally:
            session.close()
        return ""
    

    エンジンが無制限に作成されないように、その上に何らかのLRUを追加する必要があります。

    flask-sqlalchemy 各モデルが異なるデータベースに接続する、限定された形式の複数のデータベースをサポートしています。これが当てはまる場合、ドキュメントはこちら です。 。




    1. PHPスクリプトを毎日自動的に実行する方法は?

    2. PL/pgSQL関数のSELECTまたはPERFORM

    3. mysqlクライアントでviキーバインディングを機能させる方法は?

    4. Wordpressはmysqlサーバーに接続できません