2016-09-12 6 views
0

したがって、私はsqlalchemyがどのように動作するかについて多くの矛盾するレポートを読んできました。私はそれが私の経験にマッチするように見えるなど、クエリをキャッシュしないことをお読みください。SQLAlchemyのexpire_allは実際にキャッシュされたデータの有効期限はありますか?

私は例をあげる:

>>> x = Session.query(statusStorage).all() 
>>> for i in x: 
...  print i.id 
... 
1 
... - records omitted 
100000 
>>> Session.expire_all() 
>>> x = Session.query(statusStorage).all() 
>>> for i in x: 
...  print i.id 
... 
1 
... - records omitted 
100000 
>>> Session.commit() 
>>> x = Session.query(statusStorage).all() 
>>> for i in x: 
...  print i.id 
... 
1 
... - records omitted 
100001 

だから、このスレッドがフィールドを印刷し、その後、クラスのすべてのアイテムを取得するには、MySQLデータベースを照会しています。最初のクエリを実行した後、別のPythonプロセスで同じクエリを実行し、最後のアイテムのIDを1を加えて変更します。

次のリクエストを実行すると、expire_allの後に同じ結果が返されます。 idはまだ変更されていません。私はこれが、私が開発したコードで起こりました。そこでは、検索がフィルタリングされています。

ロールバックとコミットの両方で問題が解決されますが、expire(object)とexpire_all()の両方でsqlalchemyキャッシュの有効期限が切れません。

私はsqlalchemyに暗黙の何かを理解できませんか?ロールバックやコミットなしで、キャッシュの内容をクリアすることはできませんか?私はPython 2.7で1.0.9を実行しています。

+0

申し訳ありませんが、コメントなしの投票はかなり低かったです。これは予期しない方法で相互作用する2つのデフォルトのかなり厄介な例です。 MySQLとsqlalchemyはかなり一般的な組み合わせですが、これはおそらくこの組み合わせによって引き起こされた問題を尋ねる多くの人々に会いました。セッションのスレッド化と期限切れの適切な使用を勧められています。 – TinBane

答えて

3

私はこれをIRCで回答しましたが、InnoDBのデフォルトのトランザクション分離レベルが "REPEATABLE READ"であるということは、2番目と3番目のクエリが変更を見ることができないことを意味します。

関連する問題