SQLAlchemy поддерживает кеширование? - PullRequest
27 голосов
/ 15 октября 2008

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

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

Ответы [ 4 ]

46 голосов
/ 28 января 2010

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

Сейчас я запускаю его в производство. Сам пример находится в 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

15 голосов
/ 24 октября 2008

Не ответ на ваш второй вопрос, но из комментариев в этой ссылке указывает, что 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.
5 голосов
/ 02 ноября 2015

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

4 голосов
/ 21 ноября 2009

Или используйте кэш на уровне приложения с помощью слабых ссылок (dicref.WeakValueDictionary), см. Пример здесь: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject

...