まず、セッション定義
1.データベースに接続されたセッションを作成して管理します。モデルオブジェクトはセッションを通じてデータベースにアクセスし、返された結果をアイデンティティマップの形式でモデルオブジェクトにマッピングします。
2.操作対象の各オブジェクトはセッションにアタッチされ、セッションが閉じられていない場合、このオブジェクトは他のセッションで使用できません。セッションを閉じると、テーブルの制御権限のみが解放され、データベースの切断は解放されないため、閉じた後でもクエリタスクを実行できます。
3. scoped_session()で取得したセッションがremove()メソッドを実行しない場合、再度セッションが取得され、同じセッションが取得されます。
4.フラッシュ:事前コミット、データベースメモリに送信、まだデータベースファイルに書き込まれていない
commit:クエリを提供できるデータベースにメモリデータを直接書き込みます。
SQLAlchemy公式ウェブサイトの推奨される使用法
### another way (but again *not the only way*) to do it ###
from contextlib import contextmanager
@contextmanager
def session_scope():
"""Provide a transactional scope around a series of operations."""
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
def run_my_program():
with session_scope() as session:
ThingOne().go(session)
ThingTwo().go(session)
第二に、セッションの使用
セッションファクトリクラス:
Session = sessionmaker(binf=engine)
セッションインスタンスのライフサイクル:
1. Webがセシソンの作成を要求するたびに、使用後に閉じます。これは、SQLAlchemy公式Webサイトの推奨される使用法です。
短所:接続プールはすぐに使い果たされ、閉じられたセッションはすぐに接続プールに戻されず、要求されたときに待機中の接続が存在します。
2. Webプロジェクトはセッションをグローバルに使用します
短所:公式ウェブサイトに記載されているように、セッションはスレッドセーフではありません
The Session object is entirely designed to be used
in a non-concurrent fashion, which in terms of multithreading
means “only in one thread at a time”.
3. Thread_localモードセッションのライフサイクルと要求の同期
http://rhel.cc/2016/07/14/sqlalchemy-session/
https://www.osgeo.cn/sqlalchemy/orm/session_transaction.html
https://farer.org/2017/10/28/sqlalchemy_scoped_session/
https://blog.csdn.net/yueguanghaidao/article/details/40016235
sqlalchemy
session.commit()
session.close()接続リソースを解放する
close()
そして remove()
、彼らは将来のセッションが使用できなくなることはありません、「一時的」です。一般的に、あなたがする必要はありません close
か 、それが自動的に管理されます。remove
scoped_session
sqlalchemyは、Pythonで最も強力なormフレームワークです。間違いなく、
sqlalchemy の使用は、djangoに付属するormよりもはるかに複雑です。フラスコsqlalchemy拡張機能を使用すると、django からの距離が単純かつ簡単になります。
さらに2つの重要な構成についてお話しましょう
app.config ['SQLALCHEMY_ECHO'] = True = "設定出力sqlステートメント
app.config ['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True ="
1日ごとに何か他のものが書かれている場合、すべてのリクエストにdb.session.commit()を自動的に送信するビューにはdb.session.addがありますが、db.session.commitはありません。疑いなく、彼は上記の
オプションを構成したに違いありません。
これは、app.teardown_appcontext Registration
@teardown
def shutdown_session(response_or_exc):
if app.config ['SQLALCHEMY_COMMIT_ON_TEARDOWN']:
if response_or_exc is None:
self.session.commit()
self.session.remove()
return response_or_exc
違い