Запоминание SQL-запросов
Скажем, у меня есть функция, которая запускает SQL-запрос и возвращает фрейм данных:
import pandas.io.sql as psql
import sqlalchemy
query_string = "select a from table;"
def run_my_query(my_query):
# username, host, port and database are hard-coded here
engine = sqlalchemy.create_engine('postgresql://{username}@{host}:{port}/{database}'.format(username=username, host=host, port=port, database=database))
df = psql.read_sql(my_query, engine)
return df
# Run the query (this is what I want to memoize)
df = run_my_query(my_query)
Я бы хотел:
- Иметь возможность запоминать мой запрос выше с одной записью кэша на значение
query_string
(т.е. по запросу) - Иметь возможность сброса кеша по требованию (например, на основе некоторого флага), например, чтобы я мог обновить свой кеш, если я думаю, что база данных изменилась.
1 ответ
Решение
Да, вы можете сделать это с помощью joblib (этот пример в основном вставляется сам):
>>> from tempfile import mkdtemp
>>> cachedir = mkdtemp()
>>> from joblib import Memory
>>> memory = Memory(cachedir=cachedir, verbose=0)
>>> @memory.cache
... def run_my_query(my_query)
... ...
... return df
Вы можете очистить кеш, используя memory.clear()
,
Обратите внимание, что вы также можете использовать lru_cache
или даже "вручную" с простым диктом:
def run_my_query(my_query, cache={})
if my_query in cache:
return cache[my_query]
...
cache[my_query] = df
return df
Вы можете очистить кеш с run_my_query.func_defaults[0].clear()
(не уверен, что я бы порекомендовал это, хотя, просто думал, что это был забавный пример).