11

SQL Alchemy に問題があります。私のアプリは常に動作する Python アプリケーションとして動作します。

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

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}

これは明確な例だと思います.1つの結果セットはデータベースから取得され、2番目は引数として渡されます.

問題は、データベースのデータを変更しても、この関数は何も変更されていないようなデータを返すことです。入力パラメーターのデータを変更すると、返されるパラメーター「計算」に適切な値が含まれています。

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

SQLAlchemy キャッシングについて次のような質問がいくつかあったことを私は知っています。

Sqlalchemy orm セッションでキャッシュを正しく無効にする方法は?

SQLAlchemy キャッシュを無効にするには?

しかし、この状況を他にどのように呼ぶことができますか? SQLAlchemy は以前に取得したデータを保持し、アプリケーションを再起動するまで新しいクエリを実行しないようです。どうすればそのような行動を避けることができますか?

4

3 に答える 3

16

を呼び出すsession.expire_all()と、データベースにロードされたすべてのデータがセッションから削除されます。その後のオブジェクト属性へのアクセスは、新しいSELECTステートメントを発行し、新しいデータを取得します。背景については、 http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiringを参照してください。

を呼び出した後もいわゆる「キャッシング」が表示される場合は、上記の私の回答expire_all()で説明されているように、トランザクションを閉じる必要があります。

于 2012-08-24T20:23:09.643 に答える
2

いくつかの可能性。

  1. session不適切または不適切な時期に再利用しています。ベスト プラクティスは、sessionコミット後に破棄し、使用する直前に新しいものを取得することです。キャッシュのように見える動作は、実際には、アプリケーションのsession有効期間が非常に長いことが原因である可能性があります。
  2. よりも長く存続するオブジェクトはsession、後続の にマージされませんsession。「メタデータ」は、それらをマージして戻さないと、その状態を更新できない場合があります。これは、SQLAlchemy の ORM API にとってより懸念事項であり、これまでのところ使用していないようです。
  3. 変更はコミットされていません。あなたはそう言っているので、これはそうではないと仮定しますが、他の方法で説明できない場合は、もう一度調べてみてください.

一般的なデバッグのヒント: SQLAlchemy がデータベースで何をしているかを正確に知りたい場合はecho=Truecreate_engine関数に渡します。エンジンは、実行するすべてのクエリを出力します。

また、ORM を使用していて、トランザクションの問題を抱えていた他の誰かに私が行ったこの提案も確認してください。多分それはあなたを助けるでしょう。

于 2012-08-24T13:20:21.390 に答える