2013-12-12 3 views
4

С RODBC были такие функции, как sqlUpdate(channel, dat, ...), что позволило вам пройти dat = data.frame(...) вместо того, чтобы создавать собственную строку SQL.Как передать data.frame для UPDATE с R DBI

Однако, с R-х DBI, все я вижу, такие функции, как dbSendQuery(conn, statement, ...), которые только принимают строку statement и не дает возможность указать data.frame непосредственно.

Итак, как UPDATE с использованием data.frame с DBI?

+2

См 'dbWriteTable'. –

+2

Спасибо, что работает для 'INSERT', но как выполнить' UPDATE'? – mchen

ответ

7

Действительно поздно, мой ответ, но, возможно, все-таки полезно ...

Там не одна функция (я знаю) в/Odbc пакета DBI, но вы можете повторить поведение обновления, используя заявление, подготовленное обновление (который должен работать быстрее, чем RODBC-х sqlUpdate, поскольку он отправляет значение параметров в виде пакета на сервер SQL:

library(DBI) 
library(odbc) 

con <- dbConnect(odbc::odbc(), driver="{SQL Server Native Client 11.0}", server="dbserver.domain.com\\default,1234", Trusted_Connection = "yes", database = "test") # assumes Microsoft SQL Server 

dbWriteTable(con, "iris", iris, row.names = TRUE)  # create and populate a table (adding the row names as a separate columns used as row ID) 

update <- dbSendQuery(con, 'update iris set "Sepal.Length"=?, "Sepal.Width"=?, "Petal.Length"=?, "Petal.Width"=?, "Species"=? WHERE row_names=?') 

# create a modified version of `iris` 
iris2 <- iris 
iris2$Sepal.Length <- 5 
iris2$Petal.Width[2] <- 1 
iris2$row_names <- rownames(iris) # use the row names as unique row ID 

dbBind(update, iris2) # send the updated data 

dbClearResult(update) # release the prepared statement 

# now read the modified data - you will see the updates did work 
data1 <- dbReadTable(con, "iris") 

dbDisconnect(con) 

Это работает только если у вас есть первичный ключ, который я создал в приведенном выше примере, используя имена строк, которые уникальное число увеличилось на 1 для каждой строки ...

Для получения дополнительной информации о пакете odbc я использовал в заявлении DBI dbConnect см: https://github.com/rstats-db/odbc

+0

Спасибо. существует ли ограничение на количество строк, которые мы пытаемся обновить сразу? Я создал длинный sql-оператор, который выполняет MERGE, и если оператор слишком длинный 'dbGetQuery' возвращает 0 (0 строк затронуты) – RockScience

+0

Нет простого ответа, потому что пакет DBI просто определяет интерфейсы и оставляет реализацию в разных DBI- совместимых пакетов. В конечном итоге все ограничения зависят от пакета драйверов, совместимого с DBI (например, 'odbc') и базы данных, а также двоичного DB-драйвера, используемого пакетом драйверов DBI. Вы используете пакет 'odbc'? Тогда лучший способ - создать пример воспроизводимого кода и базу данных и открыть проблему (попросить исправить или хотя бы документировать ограничения) на странице https://github.com/r-dbi/odbc/issues –

+0

@ RockScience Из аналогичных проблемы, которые вы описываете, я начал проверку соответствия DBI «project», где я запускаю модульные тесты «DBItest» с различными конфигурациями DBI для оценки зрелости, открытых проблем и ограничений каждой конфигурации DBI. Статус по-прежнему до-альфа, и я не опубликовал или не сделал никакого вывода из результатов, не обращаясь сначала к разработчикам, но вы можете следить за ходом на https://github.com/aryoda/R_DBI_compliance_reports (и, конечно же, попробовать запустить тесты против вашей собственной конфигурации) –

Смежные вопросы