Как я могу сохранить данные из Shiny в MySQL - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь сделать простое приложение, которое показывает данные из таблицы mySQL и помогает пользователям сохранять новые данные в ней. Я уже подключаю БД и читаю таблицу.

Проблемы начинаются, когда я сохраняю данные из блестящего ввода. Я пробовал много разных случаев, и это мне не помогло. Основная цель - добавить новую строку в таблицу в MySQL после того, как пользователь нажал «Добавить пользователя», и обновить таблицу новыми данными в пользовательском интерфейсе.

Упрощенная версия моего приложения:

library(DBI)

ui <- fluidPage(
  textInput("name", "Enter your name:"),
  numericInput("age", "How ald are you?", ""),
  submitButton("save", "Add user"),
  br(),
  tableOutput("tbl"),
)

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

  getDataSql <- function(query) {
    con = dbConnect(RMySQL::MySQL(), dbname  =  "database", host = "host", user = "root", password = "password", port = 3306)
    result <- dbGetQuery(con, query)
    dbDisconnect(con)
    result
  }

  saveDataSql <- function(query) {
    con = dbConnect(RMySQL::MySQL(), dbname  =  "database", host = "host", user = "root", password = "password", port = 3306)
    dbGetQuery(con, query)
    dbDisconnect(con)
  }

  output$tbl <- renderTable({
    query <- "SELECT * FROM test;"
    getDataSql(query)
  })

  observe({
    if (input$save > 0){
      query <- sprintf<-(paste("INSERT INTO `test` (`name`, `age`) VALUES ('", input$name, " ','", input$age, "');", sep = ""))
      saveDataSql(query)

    }
    return()
  })
}

shinyApp(ui, server) 

UPD Я обновляю часть своего кода, используя dbExecute , но он все еще не работает.

observeEvent(input$save, { con = dbConnect(RMySQL::MySQL(), 
        dbname = "stocktheft", host = "127.0.0.1", user = "root", 
        password = "123456", port = 3306) 
query <- paste("INSERT INTO test (name, age) VALUES ('", input$name, " ','", input$age, "');", sep = "") 
dbExecute(con, query) 
dbDisconnect(con) })


1 Ответ

0 голосов
/ 29 января 2020

Я только что начал с SQL и DBI, поэтому я могу ошибаться, но вы пытались использовать dbExecute(query) для выполнения команды INSERT sql? Ваш saveDataSql использует dbGetQuery для извлечения данных, а не фактически выполняет INSERT.

Например, если я хочу добавить индекс, я обычно делаю

SQLcommand <- "CREATE INDEX indxName ON myTable (myColumn)"
dbExecute(myDB,SQLcommand)

обновление

Вы также можете проверить использование submitButton. Вы сохраняете в базу данных, когда input$save > 0, что никогда не происходит, поскольку они не имеют значения. Я бы сделал что-нибудь на линии

# ui
actionButton("save", "Add user")

# server
observeEvent(input$save,{
    query <- sprintf<-(paste("INSERT INTO `test` (`name`, `age`) VALUES ('", input$name, " ','", input$age, "');", sep = ""))
    saveDataSql(query)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...