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