【问题标题】:R delete rows from data table using sqldfR使用sqldf从数据表中删除行
【发布时间】:2020-06-17 15:03:08
【问题描述】:

我想知道 R 是否不支持使用 sqldf 从数据表中删除行。我的数据看起来像这样

我正在尝试使用删除语句从数据表中删除。没有底层数据库,只有一个 data.table。但是我输入以下sql语句:

loans_good <- sqldf("Delete from LoansDT1 where status not in ('Current','Default')")

我收到以下错误消息:

'SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().' 

由于我收到相同的更新消息,我想知道这是否是一个限制。

【问题讨论】:

  • 您想在这里使用sqldf 的任何具体原因?我认为这可以直接使用 R 的标准子集操作来完成。

标签: r sqldf


【解决方案1】:

这个问题是一个常见问题解答。请参阅sqldf github home page 上的常见问题解答 8。

操作确实有效。该消息是警告消息,而不是错误消息。该消息具有误导性,您可以忽略它。请注意,问题没有显示完整的消息——完整的消息确实表明它是一条警告消息。

警告消息来自 RSQLite,而不是 sqldf 本身。它是由在某个时候引入 RSQLite 的非向后兼容更改引起的;但是,如前所述,实际操作仍然有效。

deleteupdate 作用于数据库中的表。它们不返回值,因此即使它们起作用,您也不会看到任何结果。如果您想要一个结果,您必须在deleteupdate 之后使用select 语句来检索修改后的表。

这是一个使用内置 6 行 BOD data.frame 的示例。它会删除最后一行,因为该行的 Time 大于 5。

library(sqldf)

sqldf(c("delete from BOD where Time > 5", "select * from BOD"))
##   Time demand
## 1    1    8.3
## 2    2   10.3
## 3    3   19.0
## 4    4   16.0
## 5    5   15.6
## Warning message:
## In result_fetch(res@ptr, n = n) :
##   SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().

请注意,这在 sqldf 问题中列出,其中提供了消息的解决方法:https://github.com/ggrothendieck/sqldf/issues/40

【讨论】:

  • 我看不出这与链接页面上的常见问题解答 8 有什么关系(或任何其他常见问题解答,尽管我很快浏览了它们)。
  • 在页面中搜索为什么我在更新时遇到问题?以查找常见问题解答 8。
  • 常见问题解答似乎与您答案的次要部分有关,即如何实际查看更新或删除的结果。我想,既然您以参考常见问题解答开始回答,它应该与来自 RSQLite 的警告有关。
  • 关键问题是看不到结果或消息。关键问题是问题中的代码根本没有任何效果,因为没有添加select,没有返回任何内容。
【解决方案2】:

您需要使用dbExecute() 来执行删除、更新或插入查询。

conn <- dbConnect("Put your connection to your database here")

dbExecute(
  conn,
  "Delete from LoansDT1 where status not in ('Current','Default')"
)

dbReadTable(conn, LoansDT1) # Check

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2011-12-16
    • 2016-09-15
    • 1970-01-01
    • 2019-04-16
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多