我可以 运行 一个 SQL 更新语句只使用 R 中的 dplyr 语法吗
Can I run an SQL update statement using only dplyr syntax in R
我需要在某些 PostgreSQL
数据库 table 的其他列上有条件地更新列值。我设法在 R 中编写了一个 SQL 语句并使用 DBI
包中的 dbExecute
执行它。
library(dplyr)
library(DBI)
# Establish connection with database
con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "myDb",
host="localhost", port= 5432, user="me",password = myPwd)
# Write SQL update statement
request <- paste("UPDATE table_to_update",
"SET var_to_change = 'new value' ",
"WHERE filter_var = 'filter' ")
# Back-end execution
con %>% dbExecute(request)
是否可以仅使用 dplyr
语法来做到这一点?出于好奇,我试过了,
con %>% tbl("table_to_update") %>%
mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change)
它在 R 中有效,但显然在 db 中什么也不做,因为它使用了 select
语句。 copy_to
只允许 append
和 overwite
选项,所以我不知道如何使用它,除非删除然后附加过滤后的观察结果...
当前的 dplyr 0.7.1(带有 dbplyr 1.1.0)不支持这个,因为它假定所有数据源都是 immutable。通过 dbExecute()
发布 UPDATE
似乎是最好的选择。
要替换 table 中的较大块,您还可以:
- 通过
copy_to()
. 将数据帧写入数据库中的临时table
- 开始交易。
- 发出一个
DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
- 发出一个
INSERT INTO ... SELECT * FROM <temporary table>
- 提交交易
根据您的模式,您可以执行单个 INSERT INTO ... ON CONFLICT DO UPDATE
而不是 DELETE
,然后执行 INSERT
.
我需要在某些 PostgreSQL
数据库 table 的其他列上有条件地更新列值。我设法在 R 中编写了一个 SQL 语句并使用 DBI
包中的 dbExecute
执行它。
library(dplyr)
library(DBI)
# Establish connection with database
con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "myDb",
host="localhost", port= 5432, user="me",password = myPwd)
# Write SQL update statement
request <- paste("UPDATE table_to_update",
"SET var_to_change = 'new value' ",
"WHERE filter_var = 'filter' ")
# Back-end execution
con %>% dbExecute(request)
是否可以仅使用 dplyr
语法来做到这一点?出于好奇,我试过了,
con %>% tbl("table_to_update") %>%
mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change)
它在 R 中有效,但显然在 db 中什么也不做,因为它使用了 select
语句。 copy_to
只允许 append
和 overwite
选项,所以我不知道如何使用它,除非删除然后附加过滤后的观察结果...
当前的 dplyr 0.7.1(带有 dbplyr 1.1.0)不支持这个,因为它假定所有数据源都是 immutable。通过 dbExecute()
发布 UPDATE
似乎是最好的选择。
要替换 table 中的较大块,您还可以:
- 通过
copy_to()
. 将数据帧写入数据库中的临时table
- 开始交易。
- 发出一个
DELETE FROM ... WHERE id IN (SELECT id FROM <temporary table>)
- 发出一个
INSERT INTO ... SELECT * FROM <temporary table>
- 提交交易
根据您的模式,您可以执行单个 INSERT INTO ... ON CONFLICT DO UPDATE
而不是 DELETE
,然后执行 INSERT
.