#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 , ... )