mysql - 选择 SQL 列以进入 Shiny 状态

标签 mysql r shiny rmysql

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/

相关文章:

php - 为什么我的日期没有显示在此图表上(drupal、php、mysql)?

html - 如何并排放置两个文件输入 R Shiny

javascript - R Shiny 应用程序,制作自动向下滚动的日志

php - 在 PHP 中使用时 MySQL 查询语法错误

c# - 尝试在 540 万条记录中查找一条记录时,如何提高 varchar(400) 的查询性能

r - 使用 R 的对数正态分布的最大似然估计

Regex\x96 类似字符

r - 为矩阵中的某些相关性在 R 中生成图形

r - Googlesheets4 不读取我的电子表格

php - 使用 php 将搜索中的两个单独的输入字段合并