R:使用RJDBC将csv文件插入数据库

R:使用RJDBC将csv文件插入数据库,r,insert,bulkinsert,rjdbc,R,Insert,Bulkinsert,Rjdbc,由于RJDBC是我能够在Ubuntu上使用的唯一软件包,我正试图使用它将CSV文件插入数据库 我可以做以下工作: # Connecting to database library(RJDBC) drv <- JDBC('com.microsoft.sqlserver.jdbc.SQLServerDriver', 'drivers/sqljdbc42.jar', identifier.quote="'") connection_string <- "jdbc:sqlserver://b

由于RJDBC是我能够在Ubuntu上使用的唯一软件包,我正试图使用它将CSV文件插入数据库

我可以做以下工作:

# Connecting to database
library(RJDBC)
drv <- JDBC('com.microsoft.sqlserver.jdbc.SQLServerDriver', 'drivers/sqljdbc42.jar', identifier.quote="'")
connection_string <- "jdbc:sqlserver://blablaserver;databaseName=testdatabase"
ch <- dbConnect(drv, connection_string, "username", "password")

# Inserting a row
dbSendQuery(ch, "INSERT INTO cpr_esben.CPR000_Startrecord (SORTFELT_10,OPGAVENR,PRODDTO,PRODDTOFORRIG,opretdato) VALUES ('TEST', 123, '2012-01-01', '2012-01-01', '2012-01-01')")
#连接到数据库
图书馆(RJDBC)

drvRJDBC是建立在DBI之上的,它有许多有用的函数来完成这样的任务。您需要的是
dbWriteTable
。语法将是:

dbWriteTable(ch, 'cpr_esben.CPR000_Startrecord', df, append = TRUE)
并将替换write.table行


我不太熟悉RJDBC,但我认为sendQuery的问题在于,您在SQL语句中引用了
test.csv
,而SQL语句没有找到您使用
write.table
创建的文件,因为该SQL语句的范围不在您的工作目录中

如果您从数据中创建一条语句会怎么样?比如:

# Data from your example
df <- data.frame(matrix(c('TEST', 123, '2012-01-01', '2012-01-01', '2012-01-01'), nrow = 1), stringsAsFactors = F)
colnames(df) <- c("SORTFELT_10","OPGAVENR","PRODDTO","PRODDTOFORRIG","opretdato")
class(df$SORTFELT_10) <- "character"
class(df$OPGAVENR) <- "character"
class(df$PRODDTO) <- "character"
class(df$PRODDTOFORRIG) <- "character"
class(df$opretdato) <- "character"

# Formatting rows to insert into SQL statement
rows <- apply(df, 1, function(x){paste0('"', x, '"', collapse = ', ')})
rows <- paste0('(', rows, ')')

# SQL statement
statement <- paste0(
  "INSERT INTO cpr_esben.CPR000_Startrecord (", 
  paste0(colnames(df), collapse = ', '), 
  ')',
  ' VALUES ',
  paste0(rows, collapse = ', ')
)

dbSendQuery(ch, statement)
#示例中的数据

df您是否尝试将文件直接加载到数据库中,如下所示

library(RJDBC)
drv <- JDBC("connections")      
conn <- dbConnect(drv,"...")

query = "LOAD DATA INFILE 'test.csv' INTO TABLE test"
dbSendUpdate(conn, query)
库(RJDBC)

drv使用“write table”方法时我的问题是,我需要在数据库中创建新表的权限(即使我选择“append=TRUE”)。我之所以选择在SQL查询中引用我的csv文件,是因为我受到了这篇文章的启发,如果你没有写权限,什么都不能用,你到底有什么权限?同意穆迪的观点。如果要复制链接的示例,还需要反映它们使用的完整路径结构。我有写权限,但没有创建新表的权限。
DBI::dbWriteTable(…,append=TRUE)
如何创建新表?通常,
create=TRUE,append=TRUE
是直接矛盾的,并且会出错。如果有大数据帧,这是一个非常难看的解决方案,但我最终做了类似的事情。最后,我将CSV文件写入文件,然后使用BCP上载数据。如果没有更好的解决方案出现,那么我将为您提供解决方案,因为它确实起到了作用。是的,这很难看,但我相信这是使用
dbSendQuery
功能的唯一方法
dbWriteTable
在幕后做了类似的事情,但您看不到它生成的丑陋语句xD
library(RJDBC)
drv <- JDBC("connections")      
conn <- dbConnect(drv,"...")

query = "LOAD DATA INFILE 'test.csv' INTO TABLE test"
dbSendUpdate(conn, query)