Как я могу уменьшить сложность и длину SQL-запроса в приложении RShiny?

#sql #r #shiny #shiny-server #shinyapps

#sql #r #блестящий #блестящий сервер #shinyapps

Вопрос:

Я создаю приложение с использованием RShiny, которое запрашивает базу данных SQLite. Я закончил писать код для приложения, но у меня возникли проблемы с уменьшением сложности запроса / использованием функции glue_sql. На данный момент существует множество операторов OR, которые, как я полагаю, могут замедлять выполнение запроса. Я использовал sqlInterpolate для выполнения запроса, чтобы предотвратить любые SQL-инъекции, поскольку это то, что указано на веб-сайте RShiny как то, что должно быть сделано.

Это мой код на данный момент:

Пользовательский интерфейс:

 ui <- fluidPage(theme = shinytheme("cerulean"),
titlePanel("Application"),
sidebarLayout(
sidebarPanel(
checkboxGroupInput(inputId = "Assay", label = "Assay Type:", choices = c("MBP1","EV","Oxidation","WGAS","WLS","Genomics"),
selected = c("MBP1","EV","Oxidation","WGAS","WLS","Genomics")), #Assay
checkboxGroupInput(inputId = "Vendor", label = "Vendor:", choices = c("AKE","BSA"),
selected = c("AKE","BSA")), #Vendor
actionButton("read", "Read From Database"),
checkboxGroupInput(inputId = "Study",
                    label = "Study Type",
                    choices = c("MP", "CSP"),
selected = c("MP", "CSP")),
dateRangeInput(inputId = "Date", label = "Sample Date Range:", format ="yyyy-mm-dd"), #Date
actionButton("read", "Read From Database")),
        mainPanel(h1("Sample Count:"),
 dataTableOutput("Samples_Sorted_by_Study"),
 dataTableOutput("Samples_Sorted_by_Assay_and_Vendor")) #table
    ) #closing navbarPage
) #closing fluidPage UI
  

Сервер:

 server <- function(input, output){
    #Storing values in myData variable
    myData <- reactiveValues()
    observeEvent(
        input$read,
        {
            myData$assay <- input$Assay
            myData$vendor <- input$Vendor
            myData$date_val <- input$Date
            myData$studytype <- input$Study

            #Opening database connection
            connectiontodb <- dbConnect(RSQLite::SQLite(), "example.sqlite")

            #Shortening Query??
            #myData$study_int <- c(myData$studytype[1], myData$studytype[2])
            #myData$study_int <- glue_sql("{myData$study_int*}")
            
            #conducting first query of samples grouped by study 
            #Sample query of example.sqlite database

            myData$interpolatequery1 <- sqlInterpolate(connectiontodb,
            "Select study, count(genomic_id), count(specimen_id)
            FROM exampletable WHERE study = ?studytype1 OR study = ?studytype2
            GROUP BY study", 
            studytype1 = myData$studytype[1], studytype2 = myData$studytype[2])

            myData$exampledataSQLQuery1 <- dbGetQuery(connectiontodb, myData$interpolatequery1)

            #Closing connection to database
            dbDisconnect(connectiontodb)
  
            #Correcting Column Names
            colnames(myData$exampledataSQLQuery1) <- c("Study", "Genomic Id", "Specimen Id")     
 }
    )
    
    output$Samples_Sorted_by_Study <- renderDataTable(myData$exampleSQLQuery1)
    

}

shinyApp(ui = ui, server = server)
  

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

Комментарии:

1. Вашему запросу требуется предложение GROUP BY.

2. Вы правы, спасибо за напоминание, именно в моем коде в RStudio допущена ошибка при переписывании его для этого поста.

3. вы можете заменить ORs на IN в вашем операторе were: WHERE study IN (?studytype1 , ?studytype2 , ... )