Suporta SQLAlchemy cache?
-
03-07-2019 - |
Pergunta
O SQLAlchemy apoiar algum tipo de cache, então se eu repetidamente executar a mesma consulta que retorna a resposta do cache em vez de consultar o banco de dados? É esse cache apagadas automaticamente quando o DB está atualizado?
Ou qual é a melhor maneira de implementar isso em uma configuração CherryPy + SQLAlchemy?
Solução
Nós temos uma solução bastante abrangente caching, como um exemplo em conjunto com ganchos embarcados, em 0,6. É uma receita a subclasse Query, torná-lo consciente da taça, e permitir o controle de cache de consulta para consultas explícitas, bem como carregadores preguiçosos via opções de consulta.
Estou executando-lo em produção agora. O exemplo em si é na dist ea documentação introdução é em http: // www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .
UPDATE: Copo agora foi substituído por caching dogpile
: http://docs.sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
Outras dicas
Não é uma resposta à sua segunda pergunta, mas a partir dos comentários em este link indica que SQLAlchemy não suporta cacheing: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
Corvo disse ...
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
Jonathan Ellis disse ...
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.
SQLAlchemy suporta dois tipos de caches:
-
cache do conjunto de resultados para que repetidamente executar a mesma consulta atinge o cache em vez do banco de dados. Ele usa
dogpile
que suporta muitos backends diferentes, incluindomemcached
,redis
e arquivos básicos planas.Docs está aqui: http: // docs. sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
-
Cache o objeto
query
para que Python intérprete não tem que manualmente re-montar a string de consulta de cada vez. Essas consultas são chamadosbaked queries
eo cache é chamadobaked
. Basicamente ele armazena todo osqlalchemy
ações leva antes de bater o banco de dados - não reduzir o tempo de chamadas de banco de dados. Testes iniciais mostram aumentos de velocidade de até 40% no tempo de geraçãoquery
na troca de um ligeiro aumento na verbosity código.Docs está aqui: http://docs.sqlalchemy.org/ en / latest / ORM / extensões / baked.html
Ou usar um cache de nível de aplicativo via fracos dicts referências (weakref.WeakValueDictionary), veja um exemplo aqui: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject