记住SQL查询

时间:2014-08-20 20:34:31

标签: python pandas memoization joblib

假设我有一个运行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. 能够根据需要强制执行缓存重置(例如,基于某些标记),例如如果我认为数据库已经更改,我可以更新我的缓存。
  3. 如何使用joblibjug

    执行此操作

1 个答案:

答案 0 :(得分:4)

是的,您可以使用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()(不确定我会推荐这个,只是觉得这是一个有趣的例子)。