gpt4 book ai didi

mysql - 选择 SQL 列进入 Shiny 状态

转载 作者:行者123 更新时间:2023-12-04 10:37:46 25 4
gpt4 key购买 nike

shiny 和 SQL server 是链接的。
我们通过来自 Shiny 的输入成功地指定了搜索条件。
是不是可以在shiny的输出中选择以这种方式获取的列名?
用户界面

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 中的预准备语句只能将占位符用于数据,而不能用于数据库对象(例如表名和列名)。您必须使用 paste 来构建查询:
observeEvent(input$go,{
output$table <- renderTable({
sql <- paste("SELECT", input$select, "FROM City;")
dbGetQuery(pool, sql)
})
})

但请注意,这种方法可能容易发生 SQL 注入(inject),假设 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)
})
})

关于mysql - 选择 SQL 列进入 Shiny 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60092111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com