R:使用RJDBC将csv文件插入数据库
由于RJDBC是我能够在Ubuntu上使用的唯一软件包,我正试图使用它将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
# 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)