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

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

长期潜伏,第一次海报。
我正在尝试整合一个简单的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,这是一个我可以模拟的例子,没有问题,花括号和所有。

全球

  1. library(shiny)
  2. #library(glue)
  3. library(DBI)
  4. library(RPostgres)
  5. library(RPostgreSQL)
  6. library(sf)
  7. library(dplyr)
  8. library(ggplot2)
  9. library(ozmaps)
  10. con <- dbConnect(
  11. RPostgres::Postgres(),
  12. dbname = "db",
  13. host = "localhost",
  14. port = 5432,
  15. password = "password",
  16. user = "username")
  17. species_list <- data.frame(sp_id = as.integer(c(580,581)),
  18. taxon_name = c("Species1","Species2")) ## example short list to populate dropdown
  19. *

字符串

  • UI部分:**
  1. ui <- fluidPage(
  2. # Application title
  3. titlePanel("Range Layers"),
  4. # Sidebar with a slider input for number of bins
  5. sidebarLayout(
  6. sidebarPanel(
  7. selectizeInput(inputId = 'species_choice', 'Select species or start typing', choices = c("Choose Species" = "",species_list$sp_id), selected = NULL, multiple = FALSE,
  8. options = NULL),
  9. ),
  10. # Show a plot of the distribution layer at continental scale
  11. mainPanel(
  12. plotOutput("distPlot")
  13. )
  14. )
  15. )

服务器段:

  1. server <- function(input, output, session) {
  2. data <- reactive({
  3. req(input$species_choice)
  4. # Get the data
  5. species <- st_read(con, query = "SELECT * FROM range WHERE sp_id = {input$species_choice}")
  6. species
  7. })
  8. output$distPlot <- renderPlot({ggplot(data()) +
  9. geom_sf(ozmap_states,mapping = aes()) +
  10. geom_sf(mapping = aes(fill = taxon_id_r)) +
  11. ggtitle(species$taxon_name)
  12. })
  1. 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

相关问题