You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键说明

  1. 会话状态的作用:st.session_state在用户会话期间保留数据,页面刷新不会丢失编辑内容
  2. 缓存逻辑调整:优先读取会话状态的修改数据,保证刷新后显示最新编辑结果
  3. 保存后的操作:调用load_Raw_Address.clear()清除缓存,下次加载会从数据库拉取新数据;也可选择保留会话状态,继续展示修改后的数据
  4. 弃用函数替换:st.cache_data是Streamlit官方推荐的数据缓存函数,替代旧的st.experimental_memo

内容的提问来源于stack exchange,提问作者Arsalan Chaudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:45:37