Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Flask-SQLAlchemy - conexões em tempo real para vários bancos de dados

Um banco de dados


O mecanismo é o que permite usar o pool de conexões. Por padrão, ele persistirá nas conexões entre as solicitações. O uso básico (sem coisas extravagantes como scoped_session ou sessionmaker ) é como isso:
engine = create_engine(...)

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

Além disso, você pode adicionar scoped_session e 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 facilita sua vida fornecendo tudo isso:
db = SQLAlchemy(app)

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

Vários bancos de dados


Você pode facilmente estender esse conceito para vários bancos de dados:
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 ""

Quando você adiciona scoped_session e 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 ""

Isso fica um pouco chato quando você tem muitos bancos de dados, nesse caso você provavelmente deve escrever uma classe de registro para acompanhar todos os mecanismos e sessões:
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 ""

Você precisará adicionar algum tipo de LRU em cima dele para que não haja criação ilimitada de mecanismos.

flask-sqlalchemy tem suporte para uma forma limitada de vários bancos de dados em que cada um de seus modelos se conecta a um banco de dados diferente. Se isso se aplica a você, a documentação está aqui .