web-dev-qa-db-ja.com

SQLAlchemyはキャッシュをサポートしていますか?

SQLAlchemyはある種のキャッシュをサポートしているので、同じクエリを繰り返し実行すると、データベースにクエリを実行する代わりに、キャッシュからの応答が返されますか? DBが更新されると、このキャッシュは自動的にクリアされますか?

または、CherryPy + SQLAlchemyセットアップでこれを実装するための最良の方法は何ですか?

28
daniels

0.6には、埋め込みフックと組み合わせた例として、かなり包括的なキャッシュソリューションがあります。これは、クエリをサブクラス化し、ビーカーを認識させ、クエリオプションを介して明示的なクエリとレイジーローダーのクエリキャッシュを制御できるようにするためのレシピです。

現在、本番環境で実行しています。例自体はdistにあり、イントロドキュメントは http://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching にあります。

更新:ビーカーはdogpileキャッシングに置き換えられました: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

48
zzzeek

2番目の質問への回答ではありませんが、このリンクのコメントから、SQLAlchemyがキャッシュをサポートしていないことがわかります: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html

レイヴンは言った...

Does SQLAlchemy do any kind of internal caching?

For example, if you ask for the same data twice (or an obvious subset
of the initially requested data) will the database be hit once or twice?

I recently wrote a caching database abstraction layer for an
application and (while fun) it was a fair bit of work to get it to a
minimally functional state. If SQLAlchemy did that I would seriously
consider jumping on the bandwagon.

I've found things in the docs that imply something like this might be
going on, but nothing explicit.
4:36 PM

ジョナサンエリスは言った...

No; the author of SA [rightly, IMO] considers caching a separate concern.

What you saw in the docs is probably the SA identity map, which makes it so 
if you load an instance in  two different places, they will refer
to the same object. But the database will still be queried twice, so it is
not a cache in the sense you mean.
15
torial

SQLAlchemyは、次の2種類のキャッシュをサポートしています。

  1. 同じクエリを繰り返し実行するとデータベースではなくキャッシュにヒットするように結果セットをキャッシュします。 dogpilememcached、基本的なフラットファイルなど、さまざまなバックエンドをサポートするredisを使用します。

    ドキュメントはここにあります: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

  2. queryオブジェクトをキャッシュして、Pythonインタープリターがクエリ文字列を毎回手動で再構築する必要がないようにします。これらのクエリはbaked queriesと呼ばれ、キャッシュはbakedと呼ばれます。基本的には、データベースにアクセスする前にsqlalchemyが実行するすべてのアクションをキャッシュします。データベース呼び出しは削減されません。初期ベンチマークでは、queryコードの冗長性のわずかな増加とのトレードオフでの生成時間。

    ドキュメントはここにあります: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html

8
Jeff Widman

または、弱参照dict(weakref.WeakValueDictionary)を介してアプリケーションレベルのキャッシュを使用します。ここで例を参照してください: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

4
ychaouche