Как я могу изменить эту таблицу данных 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 ответ

Итак, после нескольких часов проб и ошибок я наконец понял, какие изменения необходимо внести:

  1. Изменять ? на SEQUENTIAL $ в коде (и т. д. ("name" = ? и "sex" = ? становятся "name" = $1 и "sex" = $2
  2. Удалите двойной знак равенства из WHERE "row_id" и просто используйте одиночный =.
  3. Измените двойные кавычки вокруг %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. Тем не менее, я надеюсь, что это поможет всем, кто может подойти к этой проблеме.

Другие вопросы по тегам