R удалить строки из таблицы данных с помощью sqldf - PullRequest
0 голосов
/ 05 марта 2020

Мне интересно, если R не поддерживает использование sqldf для удаления строк из таблицы данных. Мои данные выглядят так: enter image description here

, и я пытаюсь удалить их из таблицы данных с помощью оператора delete. Нет базовой базы данных, только 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().' 

Поскольку я получаю одно и то же сообщение для обновления, мне интересно, если оно ограничение.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Этот вопрос часто задаваемый. См. FAQ 8 на домашней странице sqldf github .

Операция действительно работает. Сообщение является предупреждением, а не сообщением об ошибке. Сообщение вводит в заблуждение, и вы можете игнорировать его. Обратите внимание, что в вопросе не было отображено полное сообщение - в завершенном сообщении указано, что оно является предупреждением.

Предупреждение приходит от RSQLite, а не от самого sqldf. Это вызвано не обратно совместимым изменением, которое было введено в RSQLite в какой-то момент; однако, как указано, фактическая операция работает в любом случае.

Также delete и update действуют на таблицы в базе данных. Они не возвращают значения, поэтому даже если они работают, вы не увидите никакого результата. Если вы хотите получить результат, вы должны использовать оператор select после delete или update для извлечения измененной таблицы.

Вот пример использования встроенной 6-строчной BOD data.frame , Он удаляет последнюю строку, так как эта строка имеет время больше 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().
0 голосов
/ 05 марта 2020

Вам необходимо использовать 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
...