Выберите столбец SQL, чтобы получить блестящий - PullRequest
2 голосов
/ 06 февраля 2020

блестящий и SQL сервер связаны между собой.
Нам удалось указать условия поиска с помощью ввода из блестящего.
Не удалось выбрать имена столбцов, которые будут получены таким образом в выходных данных из блестящего ?

ui.R

shinyUI(
  fluidPage(
    selectInput("select","select", choices = c("CountryCode","District","NAME")),
    textInput("ID","ID"),
    actionButton("go", "go"),
    tableOutput("table"),
    tableOutput("tablee")
  )
)

server.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)
  })

})

global.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"
)

1 Ответ

2 голосов
/ 06 февраля 2020

Этот ответ покрывает вашу первую попытку запроса:

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)
    })
})

Но учтите, что этот подход может быть подвержен внедрению SQL, предполагая, что input$select будет приходить извне. Типичный обходной путь для этой проблемы состоит в том, чтобы вместо этого подготовить некоторое количество подготовленных операторов, а затем выбрать соответствующий, основываясь на входных данных извне, например:

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)
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...