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

如何让RShiny应用自动更新SQL数据库中的新增数据?

问题解答

Q1:myFile的路径应该设置为?

你完全不需要myFile变量——原来的代码错误套用了CSV文件的更新逻辑,但你用的是SQL数据库,和本地文件无关,直接删掉这个变量就行。

Q2:如何编写checkFunc函数来检测数据是否已更新?

checkFunc的核心是返回一个能反映数据库表是否变化的值,每次这个值改变,reactivePoll就会触发valueFunc重新拉取数据。推荐两种实用方案:

方案1:如果表有更新时间字段(比如last_updated)

如果你的Test表有记录每条数据最后修改时间的字段(新增/修改数据时自动更新),直接查询该字段的最大值:

checkFunc = function() {
  dbCon <- odbcConnect("SQL")
  latest_update <- sqlQuery(dbCon, "SELECT MAX(last_updated) FROM Test")[[1]]
  odbcClose(dbCon)
  latest_update
}
方案2:如果表没有更新时间字段,查系统元数据的表修改时间

不同SQL数据库的系统表逻辑不同,举两个常见例子:

  • SQL Server:查询sys.tables的表修改时间
checkFunc = function() {
  dbCon <- odbcConnect("SQL")
  table_modify_time <- sqlQuery(dbCon, "SELECT modify_date FROM sys.tables WHERE name = 'Test'")[[1]]
  odbcClose(dbCon)
  table_modify_time
}
  • MySQL:查询information_schema.tables的表更新时间
checkFunc = function() {
  dbCon <- odbcConnect("SQL")
  table_modify_time <- sqlQuery(dbCon, "SELECT UPDATE_TIME FROM information_schema.tables WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = 'Test'")[[1]]
  odbcClose(dbCon)
  table_modify_time
}

修正后的完整代码

注意原来代码中renderTable的用法错误,valueFunc应返回数据,再通过reactive对象渲染表格:

library(RODBC)
library(shiny)

ui <- navbarPage( 
  tabPanel(
    tableOutput('table')
  )
) 

server <- function(input, output, session) { 
  data <- reactivePoll(1000, session,
                       checkFunc = function() {
                         # 这里替换为你选择的checkFunc逻辑,比如SQL Server的表修改时间
                         dbCon <- odbcConnect("SQL")
                         table_modify_time <- sqlQuery(dbCon, "SELECT modify_date FROM sys.tables WHERE name = 'Test'")[[1]]
                         odbcClose(dbCon)
                         table_modify_time
                       },
                       valueFunc = function() {
                         dbCon <- odbcConnect("SQL")
                         df <- sqlFetch(dbCon, "Test")
                         odbcClose(dbCon)
                         df  # 返回数据,不要直接在这里赋值output
                       }
  )
  
  # 基于reactive对象渲染表格
  output$table <- renderTable({
    data()
  })
} 

shinyApp(ui = ui, server = server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:00:53