在R中的sqldf中使用UPDATE语句。

问题描述 投票:0回答:1

我知道使用base R来更新值比较容易,但我必须在sqldf中进行更新。如果column2是'c',那么更新column1中的值。

column1 <- c(1,2,3,4)
column2 <- c("a","b","c","d")
temp <- data.frame(column1,column2)
sqldf("
      UPDATE temp
      set column1=100
      WHERE column2 ='c'
      ")

上面的代码给我 "数据框有0列0行 "和警告信息 "在res_fetch(res@ptr, n = n) : SQL语句必须用dbExecute()或dbSendStatement()而不是dbGetQuery()或dbSendQuery()发出。" 结果是表从来没有更新过changed。

非常感谢您的宝贵时间。

r sqldf
1个回答
2
投票

这是已知的,也是故意的。sqldf 从来没有试图更新环境中的对象。它只是通过将数据复制到sqlite(temp)数据库中并运行查询来充当管道,从来没有包打算覆盖调用环境中的源对象。

参考FAQ 8中的 sqldf README:

虽然传递给sqldf的SQL语句中引用的数据框架会自动导入到SQLite中,但出于安全考虑,sqldf不会自动导出任何东西。因此,如果你使用sqldf更新一个表,你必须显式地返回它,如下面的例子所示。

使用你的数据。

sqldf(c("
       UPDATE temp
       set column1=100
       WHERE column2 ='c'
       ", "select * from main.temp"))
# Warning in result_fetch(res@ptr, n = n) :
#   SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().
#   column1 column2
# 1       1       a
# 2       2       b
# 3     100       c
# 4       4       d

(你可以安全地忽略这个警告,这是因为第一条语句没有返回任何东西。)

因此,如果要真正使用这个在你的环境中就地更新对象,你需要自己捕捉输出。

temp
#   column1 column2
# 1       1       a
# 2       2       b
# 3       3       c
# 4       4       d
temp <- suppressWarnings(sqldf(c("
      UPDATE temp
      set column1=100
      WHERE column2 ='c'
      ", "select * from main.temp")))
temp
#   column1 column2
# 1       1       a
# 2       2       b
# 3     100       c
# 4       4       d
© www.soinside.com 2019 - 2024. All rights reserved.