PostgreSQL DB查询中的用户输入失败

omjgkv6w  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(180)

长期潜伏,第一次海报。
我正在尝试整合一个简单的Shiny应用程序,允许用户选择一个物种(使用一个图标),并在Map上显示物种的分布范围。到目前为止,我主要在预处理的图标框架中使用Shiny,这很容易,但物种的空间范围很大,很复杂,因此存储在PostgreSQL数据库中。
无论是直接在控制台还是在Shiny脚本中,我都没有与数据库连接的问题。即连接存在,我可以访问表并使用例如dbGETQuery dbGetQuery(con, "SELECT * FROM range WHERE sp_id = 664")或st_read st_read(con, query = "SELECT * FROM range WHERE sp_id = 580")。结果与预期一致。
这个问题似乎是在尝试将用户输入(物种选择)输入到PostgreSQL DB的SQL查询中时出现的。这无疑是一件简单的事情,但我无法找出我做错了什么。
这是我最终得到的错误:* 警告:错误:未能准备查询:错误:语法错误在或附近“{”行1:SELECT * FROM范围WHERE sp_id = {input$species_choice} *
系统似乎不喜欢使用'{}'括号,但据我所知,这似乎是一个合法的符号(如图所示,例如:text,这是一个我可以模拟的例子,没有问题,花括号和所有。

全球

library(shiny)
#library(glue)
library(DBI)
library(RPostgres)
library(RPostgreSQL)
library(sf)
library(dplyr)
library(ggplot2)

library(ozmaps)
con <- dbConnect(
  RPostgres::Postgres(),
  dbname = "db",
  host = "localhost",
  port = 5432,
  password = "password",
  user = "username")

species_list <- data.frame(sp_id  = as.integer(c(580,581)),
                            taxon_name = c("Species1","Species2")) ## example short list to populate dropdown

*

字符串

  • UI部分:**
ui <- fluidPage(

    # Application title
    titlePanel("Range Layers"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
          selectizeInput(inputId = 'species_choice', 'Select species or start typing', choices = c("Choose Species" = "",species_list$sp_id), selected = NULL, multiple = FALSE,
                         options = NULL),
        ),

        # Show a plot of the distribution layer at continental scale
        mainPanel(
           plotOutput("distPlot")
        )
    )
)

服务器段:

server <- function(input, output, session) {
  data <- reactive({
    req(input$species_choice)
    
    # Get the data
    species <- st_read(con, query = "SELECT * FROM range WHERE sp_id = {input$species_choice}")

    species
})

output$distPlot <- renderPlot({ggplot(data()) +
              geom_sf(ozmap_states,mapping = aes()) +
             geom_sf(mapping = aes(fill = taxon_id_r)) + 
              ggtitle(species$taxon_name)
    
})
shinyApp(ui = ui, server = server)

的字符串
毫无疑问,这个答案是我忽略的愚蠢的东西,但它目前正在把我逼上绝路。任何和所有的见解非常感谢!

ekqde3dh

ekqde3dh1#

好吧,再看一下这个,解决方案,正如预期的那样,非常简单。与dbGetQuery不同,st_read似乎对SQL语句的构造方式更敏感。
下面的代码解决了这个问题,简单地使用粘贴来复制字符串的第一部分(SQL),然后是用户输入引用:data <- reactive({ req(input$species_choice) st_read(con, query = paste(" SELECT * FROM range WHERE sp_id = ",input$species_choice)
很容易,一旦你弄清楚了:-D

相关问题