Поддерживает ли SQLAlchemy кэширование?

поддерживает ли SQLAlchemy какое-то кэширование, поэтому, если я повторно запускаю один и тот же запрос, он возвращает ответ из кэша вместо запроса базы данных? Этот кэш автоматически очищается при обновлении БД?

или каков наилучший способ реализовать это на установке CherryPy + SQLAlchemy?

5 ответов


у нас есть довольно комплексное решение для кэширования, например в сочетании со встроенными крючками, в 0.6. Это рецепт запроса подкласса, чтобы он знал о Beaker и позволял управлять кэшированием запросов для явных запросов, а также ленивыми загрузчиками с помощью параметров запроса.

Я запускаю его в производство сейчас. Сам пример находится в dist, а документация intro - вhttp://www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .

UPDATE: мензурка теперь заменена на dogpile кэширование: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching


не ответ на ваш второй вопрос, но из комментариев в этой ссылке указывает, что 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


или использовать кэш уровня приложения через слабые ссылки dicts (weakref.WeakValueDictionary), см. пример здесь:http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject


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 принимает перед ударом по базе данных-он не сокращает вызовы базы данных. Начальные тесты показывают ускорение до 40% в query время генерации при компромиссе небольшого увеличения детализации кода.

    документы здесь: http://docs.sqlalchemy.org/en/latest/orm/extensions/baked.html


нет, но вы можете делать кэширование с помощью memcache.