databaserdataframerodbcr-dbi

How to pass data.frame for UPDATE with R DBI


With RODBC, there were functions like sqlUpdate(channel, dat, ...) that allowed you pass dat = data.frame(...) instead of having to construct your own SQL string.

However, with R's DBI, all I see are functions like dbSendQuery(conn, statement, ...) which only take a string statement and gives no opportunity to specify a data.frame directly.

So how to UPDATE using a data.frame with DBI?


Solution

  • Really late, my answer, but maybe still helpful...

    There is no single function (I know) in the DBI/odbc package but you can replicate the update behavior using a prepared update statement (which should work faster than RODBC's sqlUpdate since it sends the parameter values as a batch to the SQL server:

    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)
    

    This works only if you have a primary key which I created in the above example by using the row names which are a unique number increased by one for each row...

    For more information about the odbc package I have used in the DBI dbConnect statement see: https://github.com/rstats-db/odbc