代码之家  ›  专栏  ›  技术社区  ›  daniels

SQLAlchemy是否支持缓存?

  •  27
  • daniels  · 技术社区  · 16 年前

    sqlAlchemy是否支持某种缓存,因此如果我重复运行相同的查询,它将从缓存返回响应,而不是查询数据库?更新数据库时是否自动清除此缓存?

    或者,在cherrypy+sqlachemy设置上实现这一点的最佳方法是什么?

    5 回复  |  直到 9 年前
        1
  •  45
  •   Jeff Widman    9 年前

    我们在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

        2
  •  15
  •   torial    16 年前

    不是第二个问题的答案,但从该链接中的注释中可以看出,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.
    
        3
  •  5
  •   Jeff Widman    9 年前

    SQLAlchemy支持两种类型的缓存:

    1. 对结果集进行缓存,以便重复运行同一查询时命中缓存而不是数据库。它使用 dogpile 它支持许多不同的后端,包括 memcached , redis 和基本平面文件。

      博士在这里: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching

    2. 缓存 query 对象,这样Python解释器就不必每次都手动重新组装查询字符串。这些查询被调用 baked queries 缓存被调用 baked . 基本上,它缓存所有操作 sqlalchemy 在访问数据库之前获取——它不会减少数据库调用。初步基准显示,在 查询 在代码冗长性稍微增加的权衡中生成时间。

      博士在这里: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html

        4
  •  4
  •   ychaouche    15 年前

    或者通过弱引用dicts(weakref.weakValuedictionary)使用应用程序级缓存,请参见以下示例: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

        5
  •  -4
  •   Lucky    16 年前

    不,但是可以使用memcache进行缓存。