Streamlit 1.12.0版本清除缓存报错问题求助
Streamlit 1.12.0 清除缓存及缓存装饰器适配方案
问题根源
Streamlit从1.10.0版本开始,彻底移除了st.legacy_caching模块,同时旧的@st.cache装饰器也被标记为废弃,改用新的缓存API体系,这就是你报错的原因。
解决方案分两步:
1. 替换旧的缓存装饰器
将原来的@st.cache替换为@st.cache_data(你的函数返回DataFrame这类数据,属于数据缓存场景),同时移除不再需要的allow_output_mutation=True参数(新API原生支持可变对象缓存逻辑),suppress_st_warning=True也可一并去掉:
修改后的加载函数代码:
@st.cache_data def load_General(): engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) con=engine.connect() general_query_raw='''string''' General_raw=pd.read_sql(general_query_raw,con) general_query_cleansed='''string''' General_cleansed=pd.read_sql(general_query_cleansed,con) return General_raw, General_cleansed @st.cache_data def load_Role(): engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params)) con=engine.connect() role_query_raw='''string''' Role_raw=pd.read_sql(role_query_raw,con) role_query_cleansed='''string''' Role_cleansed=pd.read_sql(role_query_cleansed,con) return Role_raw,Role_cleansed
2. 更新清除缓存的代码
用新的st.cache_data.clear()方法替换原来的st.legacy_caching.caching.clear_cache(),修改后的按钮逻辑:
def clear_cache(): st.cache_data.clear() st.sidebar.button("Refresh Program", on_click=clear_cache)
额外说明
如果你的代码中还有缓存资源(比如数据库连接池、模型实例这类非数据对象)的场景,需要用@st.cache_resource装饰器,对应的清除方法是st.cache_resource.clear()。
内容的提问来源于stack exchange,提问作者SMS
相关产品推荐
相关产品推荐

