Ist SQLAlchemy Unterstützung Caching?
-
03-07-2019 - |
Frage
Ist SQLAlchemy eine Art von Caching zu unterstützen, so, wenn ich immer wieder die gleiche Abfrage es gibt die Antwort aus dem Cache statt Abfrage der Datenbank ausgeführt? Ist das Cache automatisch gelöscht, wenn die DB aktualisiert wird?
Oder was ist der beste Weg, dies auf einem CherryPy + SQLAlchemy Setup zu implementieren?
Lösung
Wir haben eine ziemlich umfassende Caching-Lösung, als ein Beispiel in Verbindung mit eingebetteten Haken, in 0,6. Es ist ein Rezept Abfrage Unterklasse, machen es bewusst, Beaker, und für explizite Abfragen sowie faul Lader über Abfrageoptionen Steuerung der Query-Caching ermöglichen.
Ich laufe jetzt ist es in der Produktion. Das Beispiel selbst ist in dem dist und die Intro Dokumentation steht unter http: // www.sqlalchemy.org/docs/orm/examples.html#beaker-caching .
Andere Tipps
Nicht eine Antwort auf Ihre zweite Frage, aber aus den Kommentaren in diesem Link gibt an, dass SQLAlchemy nicht Cachen unterstützt: http://spyced.blogspot.com/2007/01/why-sqlalchemy-impresses-me.html
Raven sagte ...
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 sagte ...
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 unterstützt zwei Arten von Caches:
-
Caching das Ergebnis eingestellt, so dass immer wieder die gleiche Abfrage Ausführen der Cache-Treffer anstelle der Datenbank. Es verwendet
unterstütztdogpile
, die viele verschiedene Backends, einschließlichmemcached
,redis
und grundlegende flache Dateien.Docs sind hier: http: // docs. sqlalchemy.org/en/latest/orm/examples.html#module-examples.dogpile_caching
-
Caching das
query
Objekt, so dass Python-Interpreter nicht manuell muss den Query-String jedes Mal wieder zusammenbauen. Diese Abfragen werden genanntbaked queries
und der Cache wirdbaked
genannt. Grundsätzlich speichert es alle Aktionensqlalchemy
, bevor man die Datenbank übernimmt - es ist nicht auf Datenbankgespräche nicht abgeholzt. Erstes Benchmarks zeigt speedups von bis zu 40% inquery
Generationszeit bei der Abwägung von einem leichten Anstieg der Code Ausführlichkeit.Docs sind hier: http://docs.sqlalchemy.org/ en / latest / ORM / extensions / baked.html
oder verwenden Sie einen Application-Level-Cache über schwache Referenzen dicts (weakref.WeakValueDictionary), ein Beispiel sehen Sie hier: http://www.sqlalchemy.org/trac/wiki/UsageRecipes/UniqueObject