2010-11-23 5 views
8

は、私はいくつかの高速な検索を行う使うPythonで小さな古道具サーバーを持っています。サーバは、最初のリクエストでSqlAlchemyを介してmysqlに問い合わせを行い、返されたすべてのオブジェクトを辞書に入れて、その後のリクエストではDBコールを必要としません。私はちょうどdictからオブジェクトを取得し、適切な応答を与えるために必要なオブジェクトメソッドのいくつかを呼び出します。問題 - 「親インスタンス<SomeClass>がセッションにバインドされていない、怠惰なロード操作...」

最初はすべて正常です。サーバがしばらく実行した後、SQLAlchemyのオブジェクトのメソッドにアクセスするときしかし、私はこの例外を取得しています:

親インスタンスをセッションにバインドされていません。属性 'レート'の遅延読み込み操作は続行できません。

奇妙な、私はeagerload('rate')を設定しているため。

この動作のパターンは実際には見えませんが、一部のオブジェクトにしか影響しません。しかし、いったんオブジェクトに影響を与えてしまえば、Pythonサーバーを再起動するまで、各要求に対してこれが続けられます。

アイデア?

+0

私はちょうどeagerloaded「率」プロパティの呼び出しのいずれかに気づいて、私はそれがeagerloadedた方法とは異なるルックアップパスを使用していますので、私はそれを修正して、それが違いを作るかどうかを確認します。 – Tony

+0

違いはありますか? –

+1

レートはどのように定義されていますか?それはsa.orm.rellationですか?たぶん、いくつかのサンプルコードを投稿してください。 –

答えて

7

あなたはおそらくキャッシュリクエスト間でオブジェクト、および発生したコミット、セッションオブジェクトは、オブジェクトを無効、クリアなっています。必要に応じてワーカーを起動するマルチスレッドWebサーバー経由でサーバーを起動すると、パターンがない理由が説明されます。 あなたがこのの下を取得したいとちょうどクイックフィックスを必要といけない場合は、これは常に動作します:

if obj not in session: 
    obj = session.query(ObjClass).get(obj.id) 

適切な解決策は、あなたが要求間のキャッシュオブジェクトをないことを確認することです。

+0

私の場合、セロリタスクは同期的に呼び出され、プリミティブ型ではなくパラメータとしてオブジェクトを渡すという事実がありました。 Celeryは異なるアプリケーション環境で実行されていましたが、セッションではSQLAlchemyとセッションスコープが混同されていました。これを修正するには、呼び出しを単に '.delay()'し、プリミティブ値でパラメータを渡すだけです。 – Devy

関連する問題