單個數據庫
該引擎允許您使用連接池。默認情況下,它將持續連接請求。基本用法(不象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