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
.