sessionmaker()
Session
はファクトリであり、新しいオブジェクトを作成するための構成オプションを 1 か所だけに配置することを奨励するためにあります。これはオプションでSession(bind=engine, expire_on_commit=False)
あり、 new が必要なときはいつでも簡単に呼び出すことができますがSession
、冗長で冗長であることを除けば、それぞれがこの冗長性の問題に新しい .そしてもっと紛らわしい方法。
必要なときにオブジェクトを作成するのに役立つsessionmaker()
ツールにすぎません。Session
次の部分。Session()
問題は、さまざまな時点で新しいものを作成することと、最初から最後まで使用することの違いは何だと思います。答えは、あまりありません。 Session
入れたすべてのオブジェクトのコンテナであり、開いているトランザクションも追跡します。rollback()
またはを呼び出した時点commit()
で、トランザクションは終了し、Session
SQL を再び発行するように呼び出されるまで、 はデータベースに接続されません。オブジェクトに保留中の変更がない場合、マップされたオブジェクトへのリンクは弱い参照です。そのためSession
、アプリケーションがマップされたオブジェクトへのすべての参照を失うと、それ自体が空になり、新しい状態に戻ります。デフォルトのままにしておくと"expire_on_commit"
設定すると、コミット後にすべてのオブジェクトが期限切れになります。それSession
が 5 分から 20 分間持続し、次にデータベースを使用するときにあらゆる種類の変更があった場合、次にそれらのオブジェクトにアクセスすると、たとえそれらがメモリに残っていたとしても、まったく新しい状態がロードされます。 20分間。
Session
Web アプリケーションでは、同じものを何度も使用するのではなく、リクエストごとにまったく新しいものを作成してみませんか。このプラクティスにより、新しいリクエストが「クリーン」に開始されることが保証されます。前のリクエストの一部のオブジェクトがまだガベージ コレクションされておらず、"expire_on_commit"
おそらく off になっている場合、前のリクエストの状態がまだぶら下がっていて、その状態がかなり古い可能性さえあります。電源を入れたままにして、要求の最後expire_on_commit
に確実に電話をかけるように注意している場合は問題ありませんが、新しい から始める場合は、きれいに始めていることに疑問の余地はありません。したがって、各リクエストを新しいcommit()
rollback()
Session
Session
このフラグは、一連の操作の途中でexpire_on_commit
呼び出す操作に対して多くの余分な SQL が発生する可能性があるため、最初からやり直すことを確認し、の使用をほとんどオプションにするための最も簡単な方法です。commit()
これがあなたの質問に答えているかどうかはわかりません。
次のラウンドは、スレッド化について言及したものです。アプリがマルチスレッド化されているSession
場合は、使用中の が何かに対してローカルであることを確認することをお勧めします。 scoped_session()
デフォルトでは、現在のスレッドに対してローカルになります。Web アプリでは、リクエストに対してローカルの方が実際にはさらに優れています。Flask-SQLAlchemy は実際にカスタムの「スコープ関数」を送信してscoped_session()
、リクエスト スコープのセッションを取得します。平均的な Pyramid アプリケーションは、セッションを「リクエスト」レジストリに貼り付けます。このようなスキームを使用する場合、「リクエストの開始時に新しいセッションを作成する」というアイデアは、物事をまっすぐに保つための最も簡単な方法のように見えます。