Как передать параметр в новый фрейм данных для ОБНОВЛЕНИЯ SQL с использованием пула R

#r #parameter-passing #pool

#r #передача параметров #Бассейн

Вопрос:

Я пытаюсь передать фрейм данных в новый параметр, а затем ОБНОВИТЬ до SQL. Я застрял при передаче параметра

 library(pool)
library(RMySQL)
library(DT)
library(DBI)

ui <- actionButton("edit_button", "Copy", icon("copy"))

server <- function(input, output, session) {

  #load staff and make reactive to input
  staff <- reactive({
   
    input$submit
    input$submit_edit
   
    dbReadTable(pool, "staff")
    
  }) 

#Form for data entry
  entry_form <- function(button_id){
    
    showModal(
      modalDialog(
        div(id=("entry_form"),
            tags$head(tags$style(".modal-dialog{ width:400px}")),
            tags$head(tags$style(HTML(".shiny-split-layout > div {overflow: visible}"))),
            fluidPage(
              fluidRow(
                splitLayout(
                  cellWidths = c("250px", "100px"),
                  cellArgs = list(style = "vertical-align: top"),
                  textInput("userName", labelMandatory("userName"), placeholder = ""),
                  selectInput("picker", "picker", multiple = FALSE, choices = c("", "admin","basic"))
                ),
                textInput("email", "email", width = "354px"),
                selectInput("approval", "approval", multiple = FALSE, choices = c("", "approve", "not approve")),
                selectInput("permission", "permission", multiple = FALSE, choices = c("", "1", "0")),
                helpText(labelMandatory(""), paste("Mandatory field.")),
                actionButton(button_id, "Submit")
              ),
              easyClose = TRUE
            )
        )
      )
    )
  }

  #save form data into data_frame format
  formData <- reactive({
    
    formData <- data.frame(row_id = UUIDgenerate(),
                           userName = input$userName,
                           picker = input$picker,
                           email = input$email, 
                           approval = input$approval,
                           permission = input$permission,
                           stringsAsFactors = FALSE)
    return(formData)
    
  })

#edit data
  observeEvent(input$edit_button, priority = 20,{
    
    SQL_df <- dbReadTable(pool, "staff")
    
    showModal(
      if(length(input$staff_table_rows_selected) > 1 ){
        modalDialog(
          title = "Warning",
          paste("Please select only one row." ),easyClose = TRUE)
      } else if(length(input$staff_table_rows_selected) < 1){
        modalDialog(
          title = "Warning",
          paste("Please select a row." ),easyClose = TRUE)
      })  
    
    if(length(input$staff_table_rows_selected) == 1 ){
      
      entry_form("submit_edit")
      
      updateTextInput(session, "userName", value = SQL_df[input$staff_table_rows_selected, "userName"])
      updateSelectInput(session, "picker", selected = SQL_df[input$staff_table_rows_selected, "picker"])
      updateTextInput(session, "email", value = SQL_df[input$staff_table_rows_selected, "email"])
      updateSelectInput(session, "approval", selected = SQL_df[input$staff_table_rows_selected, "approval"])
      updateSelectInput(session, "permission", selected = SQL_df[input$staff_table_rows_selected, "permission"])
      
    }
    
  })
  
  #The dataframe should be passing at this moment
  observeEvent(input$submit_edit, priority = 20, {
    
    SQL_df <- dbReadTable(pool, "staff")
    row_selection <- SQL_df[input$staff_table_row_last_clicked, "userName"] 
    update <- dbExecute(pool, sprintf("UPDATE staff SET 'userName' = ?, 'picker' = ?, 'email' = ?,
                          'approval' = ?, 'permission' = ? WHERE row_id = '%s';", row_selection), 
                          
            param = list(input$userName,
                        input$picker,
                        input$email,
                        input$approval,
                        input$permission),
            )


    
    removeModal()
    
  })
  
 

Когда я нажимаю кнопку отправки. Появляется предупреждение.

Предупреждение: ошибка в .local: неиспользуемые аргументы (alist(param = list(«haris», «basic», «haris12@gmail.com «, «одобрить», «0»), ))

80: dbSendQuery

78: dbSendStatement

76: DBI::dbExecute

74: dbExecute

72: observeEventHandler [C:/Users/Desktop/Task/adminaccess.R#220 ]

1: runApp

Заранее спасибо

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

1. Я всегда использовал params= , а не param= . Может ли это быть причиной проблемы?

2. Есть ли особая причина, по которой вы используете привязку параметров для пяти параметров (хорошо!), Но шестой параметр, с которым вы используете интерполяцию строк sprintf ? (нехорошо) Просто сделай dbExecute(pool, "...", params=list(input$userName, ..., row_selection)) .

3. Я попробовал ваше решение, но оно все равно не сработало для меня. Итак, мое решение — удалить параметры и просто поместить переменную в запрос.

Ответ №1:

Итак, я удаляю параметры и помещаю их в запрос. Этот метод сработал для меня.

     observeEvent(input$submit_edit, priority = 20, {
    
    SQL_df <- dbReadTable(pool, "staff")
    row_selection <- SQL_df[input$staff_table_row_last_clicked, "userName"] 
    dbExecute(pool, paste0("UPDATE staff SET userName = '",input$userName,"', picker = '",input$picker,"', email = '",input$email,"',
                          approval = '",input$approval,"', permission = '",input$permission,"' WHERE userName = '",input$userName,"'")
    )
 

Спасибо за советы.

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

1. Вы перешли от в основном хорошего (подписка на «хорошие практики») к плохому (встраивание данных в строки вашего запроса). Хотя существуют опасения по поводу вредоносной SQL-инъекции (например, эксплойты XKCD для Mom , известного как «Таблицы Little Bobby»), также вызывает беспокойство искаженные строки или ошибки Unicode-vs-ANSI, даже если запрос выполняется одним аналитиком данных. Оба DBI odbc ) и RODBC поддерживают параметризованные запросы .