如何让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
相关产品推荐
相关产品推荐

