Как я могу изменить эту таблицу данных Shiny на код обновления SQL для использования с PostgresSQL?
В настоящее время я работаю над блестящим приложением для работы, которое частично основано на этом уроке Нильса ван дер Фельдена. У меня возникли проблемы со следующим фрагментом кода:
observeEvent(input$submit_edit, priority = 20, {
SQL_df <- dbReadTable(pool, "responses_df")row_selection <- SQL_df[input$responses_table_row_last_clicked, "row_id"]dbExecute(pool, sprintf('UPDATE "responses_df" SET "name" = ?, "sex" = ?, "age" = ?,"comment" = ? WHERE "row_id" = ("%s")', row_selection),param = list(input$name,input$sex,input$age,input$comment))removeModal()
})
Предполагается, что код выполняет SQL-запрос, который обновляет базу данных для отражения изменений, внесенных в диалоговом окне. При использовании с RSQLite этот код работает отлично. Однако при использовании RPostgres я получаю следующую ошибку:
Warning: Error in : Failed to prepare query: ERROR: syntax error at or near ","
LINE 1: UPDATE "responses_df" SET "name" = ?, "sex" = ?, "age" = ...
^
Я пробовал заменить ? параметры с единицами $ в надежде, что это простая синтаксическая разница, но это приводит к следующей ошибке:
Warning: Error in : Failed to prepare query: ERROR: syntax error at or near "$"
LINE 1: UPDATE "responses_df" SET "name" = $, "sex" = $, "age" = ...
^
Изменить: исправлены имена для обеспечения единообразия.
1 ответ
Итак, после нескольких часов проб и ошибок я наконец понял, какие изменения необходимо внести:
- Изменять ? на SEQUENTIAL $ в коде (и т. д. ("name" = ? и "sex" = ? становятся "name" = $1 и "sex" = $2
- Удалите двойной знак равенства из WHERE "row_id" и просто используйте одиночный =.
- Измените двойные кавычки вокруг %s на одинарные и удалите круглые скобки. Примечание. Для этого вам придется использовать escape-символ \.
Ниже я включил исправленный код: ObserveEvent(input$submit_edit, Priority = 20, {
SQL_df <- dbReadTable(pool, "responses_df")
row_selection <- SQL_df[input$responses_table_row_last_clicked, "row_id"]
dbExecute(pool, sprintf('UPDATE "responses_df" SET "name" = $1, "sex" = $2, "age" = $3,"comment" = $4 WHERE "row_id" = \'%s\'', row_selection),
param = list(input$name,input$sex,input$age,input$comment))
removeModal()
})
По сути, это была просто проблема разного синтаксиса. Кажется, Postgres настолько другой, что меня это раздражает. Это имеет смысл, поскольку я вообще не слишком люблю SQL. Тем не менее, я надеюсь, что это поможет всем, кто может подойти к этой проблеме.