单个数据库
该引擎允许您使用连接池。默认情况下,它将持续连接请求。基本用法(不象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 ""
多个数据库
当您添加
scoped_session
和
sessionmaker
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 ""
:
您可以轻松地这个概念扩展到多个数据库
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
支持有限形式的多个数据库,其中每个模型都连接到不同的数据库。如果这适用于您,则文档为here。
用你需要的任何数据替换这个问题中的“rserve”(http://stackoverflow.com/questions/28423069/how-can-a-unique-rserve-connection-be-stored-per-session) ,在这种情况下是一个SQLAlchemy引擎。 – davidism
您不会使用Flask-SQLAlchemy,因为这对于提前配置管理自己的数据库非常方便。 – davidism