用dplyr中的转换数据替换SQL数据库表

Dav*_*ein 10 sql database sqlite r dplyr

我经常在dplyr中对数据进行替换时替换数据,尤其是在处理大型数据集时.当我使用SQL支持的数据集时,我不确定如何优雅地执行此操作,至少不使用SQLite.

我在dplyr数据库插图或SO上找不到任何关于这个目标的讨论,这也让我想知道我最初做的事情是否有问题; 但是,它似乎是处理大型数据集的自然方式.

无论如何,最直观的方法不起作用:

library(dplyr)
library(RSQLite)

db2 <- src_sqlite("trouble.sqlite", create = TRUE)
trouble <- data.frame(values = c(5, 1, 3))
trouble.db <- copy_to(db2, trouble, temporary = FALSE)

collect(trouble.db) # 5, 3, 1

trouble.db <- trouble.db %>% arrange(values)
collect(trouble.db) # 1, 3, 5

trouble.in <- tbl(db2, sql("SELECT * from trouble"))
collect(trouble.in) # 5, 3, 1
Run Code Online (Sandbox Code Playgroud)

就地复制的另一种直观语法给出了"表已存在"错误:

trouble.db <- copy_to(db2, as.data.frame(trouble.db), name="trouble", temporary = FALSE)
Run Code Online (Sandbox Code Playgroud)

一种解决方案是手动删除表并重建它,这就是我一直在做的事情:

db2$con %>% db_drop_table(table = "trouble")
trouble <- collect(trouble.db)
trouble.db <- copy_to(db2, trouble, temporary = FALSE)
Run Code Online (Sandbox Code Playgroud)

另一个是放弃替换并创建一系列临时表,我发现这些表并不美观,但我认为这可能是推荐的范例:

trouble_temp <- data.frame(values = c(5, 1, 3))
trouble_temp.db <- copy_to(db2, trouble_temp, temporary = TRUE)
trouble <- trouble.db %>% arrange(values)
trouble.db <- copy_to(db2, trouble, temporary = FALSE)
Run Code Online (Sandbox Code Playgroud)

我怀疑"掉落和重新复制"最终会成为答案,但出于对美丽解决方案的热爱,我想我会问是否有更好的方法.

小智 1

对于多年后发现这一点的人来说。

该声明

trouble.db %>% arrange(values)
Run Code Online (Sandbox Code Playgroud)

创建一个 SQL 查询,该查询发送到数据库并在获得collect结果时执行。

我们可以看到SQL是这样的

trouble.db %>% arrange(values) %>% show_query()
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM `trouble`
ORDER BY `values`
Run Code Online (Sandbox Code Playgroud)

显然,这样的查询无法修改它正在查询的实际数据。

要修改数据,我们可以使用包dbWriteTable中的函数DBI

SELECT *
FROM `trouble`
ORDER BY `values`
Run Code Online (Sandbox Code Playgroud)