如何在Python-Streamlit中更新经Ag-Grid修改后的缓存DataFrame?
解决Streamlit中AgGrid修改后缓存不更新的问题
问题核心
你当前用缓存函数加载数据库原始数据,页面刷新时会重新读取缓存里的旧数据,而AgGrid修改后的数据只存在当前会话内存中,刷新就丢失了。另外st.experimental_memo已被Streamlit弃用,建议改用st.cache_data。
解决方案步骤
- 用
st.session_state持久化保存修改后的数据,跨页面刷新也能保留 - 调整缓存加载逻辑:优先读取会话状态里的修改后数据,没有再从数据库拉取
- 添加“保存到数据库”按钮,完成数据回写后可按需清除缓存或更新状态
修改后的完整代码
import streamlit as st from st_aggrid import AgGrid import pandas as pd import sqlalchemy as sa # 初始化数据库连接(替换为你的实际连接配置) con = sa.create_engine("mssql+pyodbc://<your_connection_string>") # 初始化会话状态:没有保存的修改数据时设为None if "modified_address_data" not in st.session_state: st.session_state.modified_address_data = None @st.cache_data(show_spinner=True, suppress_st_warning=True) def load_Raw_Address(): with st.spinner('从数据库加载地址数据中,可能需要稍等...'): query_raw='SELECT * FROM [dbo].[DQ_Raw_Address]' address_frame_raw = pd.read_sql(query_raw, con) return address_frame_raw # 优先加载会话状态中的修改后数据,无修改则加载数据库原始数据 if st.session_state.modified_address_data is not None: address_frame = st.session_state.modified_address_data else: address_frame = load_Raw_Address() # 展示可编辑AgGrid grid_return = AgGrid( address_frame, gridOptions=None, # 替换成你的gridoptions配置 editable=True, allow_unsafe_jscode=True, theme='balham', width="100%", height="800px" ) # 将修改后的数据同步到会话状态,保证刷新不丢失 address_frame = grid_return['data'] st.session_state.modified_address_data = address_frame # 添加数据保存按钮 if st.button('保存修改到数据库'): with st.spinner('正在保存数据到数据库...'): # 根据需求调整写入逻辑,这里用replace覆盖原表,可改为append增量更新 address_frame.to_sql( name='DQ_Raw_Address', con=con, schema='dbo', if_exists='replace', index=False ) st.success('数据已成功保存到数据库!') # 保存后清除缓存,下次加载会从数据库读取最新数据 load_Raw_Address.clear() # 可选:清空会话状态,页面重新加载数据库数据 st.session_state.modified_address_data = None
关键说明
- 会话状态的作用:
st.session_state在用户会话期间保留数据,页面刷新不会丢失编辑内容 - 缓存逻辑调整:优先读取会话状态的修改数据,保证刷新后显示最新编辑结果
- 保存后的操作:调用
load_Raw_Address.clear()清除缓存,下次加载会从数据库拉取新数据;也可选择保留会话状态,继续展示修改后的数据 - 弃用函数替换:
st.cache_data是Streamlit官方推荐的数据缓存函数,替代旧的st.experimental_memo
内容的提问来源于stack exchange,提问作者Arsalan Chaudhary
相关产品推荐
相关产品推荐

