R语言使用sqldf执行UPDATE语句未生效问题求助
问题原因
- sqldf默认操作的是R数据框的SQLite临时副本,修改后不会自动同步回R的原始数据框,仅执行UPDATE语句只会修改临时库的表,不会影响原有
df - 你看到的
must utilize dbExecute()提示是因为sqldf默认会尝试把查询结果转为数据框,UPDATE属于非查询语句,才会抛出该提示
解决方法
方案1:执行UPDATE后查询全表并回赋值
把UPDATE语句和最终查询语句放在同一个向量中传给sqldf,最后将返回结果赋值给原有df即可,修改后代码如下:
df$DiscPric = 0 head(df,5) # 执行两条UPDATE后查询全表,将结果覆盖原有df df <- sqldf(c( "UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5", "UPDATE df SET DiscPric = Total Where NumOfItems < 5", "SELECT * FROM df" ))
方案2:使用DBI接口直接操作(适合频繁写操作场景)
如果需要多次执行更新类操作,可以手动建立连接避免反复导入导出数据:
library(DBI) # 建立SQLite内存连接 con <- dbConnect(RSQLite::SQLite(), ":memory:") # 将df写入连接 dbWriteTable(con, "df", df) # 执行UPDATE dbExecute(con, "UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5") dbExecute(con, "UPDATE df SET DiscPric = Total Where NumOfItems < 5") # 将修改后的表读回R环境 df <- dbReadTable(con, "df") # 关闭连接 dbDisconnect(con)
注意事项
- 所有SQL操作的列名、表名严格区分大小写,需要和R数据框的列名完全一致
- 如果是大数据量场景,方案2的性能会明显优于方案1,避免了每次调用sqldf都重新导入数据的开销
内容的提问来源于stack exchange,提问作者Evil Dr Coconut
相关产品推荐
相关产品推荐

