从R中删除sqlite DB中表中的行

时间:2018-08-18 07:49:45

标签: r shiny dt rsqlite

我正在构建一个闪亮的应用程序,它将允许用户对sqlite3数据库中存在的表进行CRUD操作。我正在使用typeof(T)中的input$table_rows_selected()函数来获取用户选择的行的索引。然后,我尝试从数据库中删除具有匹配时间戳(将纪元时间存储为主键)的行(使用操作按钮DT)。以下代码可以正常运行,但不会删除所选行。

deleteRows

observeEvent(input$deleteRows, { if(!is.null(input$responsesTable_rows_selected)){ s=input$responsesTable_rows_selected conn <- poolCheckout(pool) lapply(length(s), function(i){ timestamp = rvsTL$data[s[i],8] query <- glue::glue_sql("DELETE FROM TonnageListChartering WHERE TonnageListChartering.timestamp = {timestamp} ", .con = conn) dbExecute(conn, sqlInterpolate(ANSI(), query)) }) poolReturn(conn) # Show a modal when the button is pressed shinyalert("Success!", "The selected rows have been deleted. Refresh the table by pressing F5", type = "success") } }) 是用于连接数据库的全局级别的处理程序。

pool

为什么这不起作用?如果可以,是否有任何方法可以刷新数据表的输出而不必重新加载应用程序?

1 个答案:

答案 0 :(得分:1)

正如@RomanLustrik所指出的,timestamp肯定发生了一些“笨拙”的变化。我对sqlite不太了解,但是运行PRAGMA table_info(TonnageListChartering);显示了这一点:

0|vesselName||0||0
1|empStatus||0||0
2|openPort||0||0
3|openDate||0||0
4|source||0||0
5|comments||0||0
6|updatedBy||0||0
7|timestamp||0||1
8|VesselDetails||0||0
9|Name||0||0
10|VslType||0||0
11|Cubic||0||0
12|DWT||0||0
13|IceClass||0||0
14|IMO||0||0
15|Built||0||0
16|Owner||0||0

我猜没有一个变量定义了数据类型,我不确定现在是否可以这样做。无论如何,我更改了query以确保时间戳在引号中。

query <- glue::glue_sql("DELETE FROM TonnageListChartering
                          WHERE TonnageListChartering.timestamp = '{timestamp}'
                          ", .con = conn)

这将删除用户选择的行。

但是,当我只剩下一行时,我无法将其删除。不知道为什么。也许是因为我在创建表时定义了主键?