6

scoped_sessionがどのように機能するかはよくわかりませんが、実際のセッションをいくつか隠して、さまざまなリクエストに対して別々に保つラッパーのようです。スレッドローカルでこれを行いますか?

とにかく問題は次のとおりです。

S = elixir.session # = scoped_session(...)
f = Foo(bar=1)
S.add(f) # ERROR, f is already attached to session (different session)

fが別のセッションでどのように終わったかはわかりませんが、これまで問題はありませんでした。他の場所には、そのように見えるコードがありますが、実際には機能します。ご想像のとおり、私はそれを非常に混乱させます。

ここでは何もわかりません。fはコンストラクターのセッションに魔法のように追加されているようですが、使用しているセッションへの参照はないようです。なぜそれは別のセッションで終わるのでしょうか?どうすればそれを正しいセッションに終わらせることができますか?とにかく、このscoped_sessionはどのように機能しますか?時々機能するように見えることもあれば、機能しないこともあります。

私は間違いなく非常に混乱しています。

4

2 に答える 2

7

スコープセッションは、渡されたセッションファクトリからオンデマンドで作成されたスレッドセッションオブジェクトごとに(デフォルトで)レジストリを保持するプロキシオブジェクトを作成します。このようなセッションメソッドにアクセスScopedSession.addすると、現在のスレッドに対応するセッションが検出addされ、そのセッションにバインドされているメソッドが返されます。このメソッドを使用して、アクティブなセッションを削除できますScopedSession.remove()

ScopedSessionにはいくつかの便利なメソッドがあります。1つはquery_property、作成されたスコープセッションとアクセスされたクラスにバインドされたクエリオブジェクトを返すプロパティを作成することです。もう1つはScopedSession.mapper、デフォルトのコンストラクターを追加し、デフォルト__init__(**kwargs) で、マッパーが作成されたスコープセッションに作成されたオブジェクトを追加することです。save_on_initこの動作は、マッパーのキーワード引数によって制御できます。ScopedSession.mapper問題になっている問題のために非推奨になりました。これは、Pythonの「暗黙的よりも明示的の方が優れている」という哲学が実際に当てはまる1つのケースです。残念ながら、Elixirはまだデフォルトでを使用していますScopedSession.mapper

于 2009-08-30T06:02:18.093 に答える
2

作成されたマッパーにelixirがsave-on-init=Trueを設定していることがわかります。これは、次の方法で無効にできます。

using_mapper_options(save_on_init=False)

これで問題は解決します。すぐに何が起こっているのかを理解してくれた#sqlalchemyのstepzに敬意を表します。私はまだscoped_sessionが実際にどのように機能するのか興味がありますが、誰かがそれに答えると、その質問に答えたことが評価されます。

于 2009-08-30T05:25:37.997 に答える