记忆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一个缓存项(即每个查询)
  • 能够根据需要强制重置缓存 (例如,基于某个标记),例如,如果我认为数据库已更改,则可以更新缓存。
  • 我如何用joblib,水壶做到这一点?


    是的,你可以用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()清除缓存(不确定我会推荐这个,只是认为它是一个有趣的例子)。

    链接地址: http://www.djcxy.com/p/80943.html

    上一篇: Memoizing SQL queries

    下一篇: How to get reason CUPS job was stopped?