shiny 和 SQL Server 已链接。
我们成功地通过shiny的输入指定搜索条件。
是不是可以在shiny的输出中选择这样获取的列名呢?
ui.R
shinyUI(
fluidPage(
selectInput("select","select", choices = c("CountryCode","District","NAME")),
textInput("ID","ID"),
actionButton("go", "go"),
tableOutput("table"),
tableOutput("tablee")
)
)
服务器.R
shinyServer(function(input, output) {
observeEvent(input$go,{
output$table <- renderTable({
sql <- 'SELECT ?select FROM City;'
query <- sqlInterpolate(pool, sql, select = input$select)
dbGetQuery(pool, query)
})
})
output$tablee <- renderTable({
sql <- "SELECT * FROM City WHERE ID = ?ID;"
query <- sqlInterpolate(pool, sql, ID = input$ID)
dbGetQuery(pool, query)
})
})
全局.R
library(shiny)
library(DBI)
library(pool)
pool <- dbPool(
drv = RMySQL::MySQL(),
dbname = "shinydemo",
host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
username = "guest",
password = "guest"
)
最佳答案
此答案涵盖您的第一次查询尝试:
observeEvent(input$go,{
output$table <- renderTable({
sql <- 'SELECT ?select FROM City;'
query <- sqlInterpolate(pool, sql, select = input$select)
dbGetQuery(pool, query)
})
})
不,你不能这样做,因为 SQL 中的预准备语句只能使用数据占位符,而不能使用数据库对象(例如表名和列名)。您必须使用粘贴来构建查询:
observeEvent(input$go,{
output$table <- renderTable({
sql <- paste("SELECT", input$select, "FROM City;")
dbGetQuery(pool, sql)
})
})
但请注意,假设 input$select
来自外部,这种方法可能容易受到 SQL 注入(inject)的影响。解决此问题的一种典型解决方法是准备一些准备好的语句,然后根据外部输入选择适当的语句,例如:
observeEvent(input$go,{
output$table <- renderTable({
sql1 <- "SELECT name FROM City;"
sql2 <- "SELECT state FROM City;"
query <- ifelse(input$select == "name", sql1, sql2)
dbGetQuery(pool, query)
})
})
关于mysql - 选择 SQL 列以进入 Shiny 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60092111/