Запоминание 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)

Я бы хотел:

  1. Иметь возможность запоминать мой запрос выше с одной записью кэша на значение query_string (т.е. по запросу)
  2. Иметь возможность сброса кеша по требованию (например, на основе некоторого флага), например, чтобы я мог обновить свой кеш, если я думаю, что база данных изменилась.

Как я могу сделать это с JobLib, кувшин?

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() (не уверен, что я бы порекомендовал это, хотя, просто думал, что это был забавный пример).

Другие вопросы по тегам