2012-08-24 41 views
5

私はSQL Alchemyに問題があります。私のアプリケーションは、常に動作するPythonアプリケーションとして動作します。 1つの結果セットがデータベースからフェッチされ、第二はちょうど引数として渡される -sqlalchemyのキャッシュを回避するには?

def myFunction(self, param1): 
    s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\ 
         .select_from(statsModel) 

    statsResult = self.connection.execute(s).fetchall() 

    return {'result': statsResult, 'calculation': param1} 

私は、これは明確な例だと思う:

は、私はこのような機能を持っています。

問題は、データベース内のデータを変更すると、この関数は何も変更されていないようなデータを返します。入力パラメータのデータを変更すると、返されたパラメータ "計算"は適切な値を持ちます。

アプリケーションサーバーを再起動すると、状況が正常に戻ります。新しいデータがMySQLからフェッチされます。

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

が、どのように他の私が呼び出すことができる。このような状況:

は、私のようなSQLAlchemyのキャッシュに関するいくつかの質問があったことを知っていますか? SQLAlchemyは以前にデータを取得したままにしておき、アプリケーションを再起動するまで新しいクエリを実行しないようです。このような行動を避けるにはどうすればいいですか?

+0

データベースのデータをどのように変更していますか?それがコミットされたのですか? – icecrime

+0

私は手動で変更します。データベースエンジンはMySQLです。はい、変更は確定しています。 – Archarius

+0

http://stackoverflow.com/a/15788051/497208は便利です –

答えて

1

いくつかの可能性があります。

  1. session不適切または不適切なタイミングで再使用しています。ベストプラクティスは、あなたがコミットした後にあなたのsessionを捨て、あなたがそれを使う前の最後の瞬間に新しいものを得ることです。キャッシングされているように見える動作は、実際にアプリケーションで非常に長いsessionの寿命が原因である可能性があります。
  2. sessionより長く存続するオブジェクトは、次のsessionにマージされません。それらを再度マージしないと、 "メタデータ"が状態を更新できないことがあります。これは、SQLAlchemyのORM APIの場合にはそれほど重要な問題です。
  3. 変更はコミットされません。あなたは彼らがそうであると仮定していると言いますが、他の道のどれもそれを説明しなければ、あなたは再び見たいかもしれません。

一つの一般的なデバッグのヒント:あなたはSQLAlchemyのがデータベースにやっている内容を正確に把握したい場合は、create_engine関数にecho=Trueを渡します。エンジンは、実行するすべてのクエリを出力します。

またcheck out this suggestion私はORMを使用していて、トランザクションの問題を抱えていた誰かに、自分の問題を突き止めずに解決しました。多分あなたを助けるでしょう。

9

session.expire_all()を呼び出すと、セッションからすべてのデータベース読み込みデータが削除されます。オブジェクト属性にアクセスすると、後で新しいSELECT文が発行され、新しいデータが戻されます。バックグラウンドについてはhttp://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiringを参照してください。

expire_all()を呼び出した後でも、いわゆる「キャッシュ」が表示される場合は、上記のリンク先のanswerに記載されているようにトランザクションをクローズする必要があります。

関連する問題