RMySQL dbWriteTable在Windows 7 x64上遇到文件路径问题

时间:2015-01-07 16:02:31

标签: r rmysql

设置

我运行MariaDB 5.5的本地实例,在那里我创建了一个有两个表的数据库。我必须使用存储在几千个.RData文件中的数据填充这些表。每个文件存储data.frames,其中包含几千到一百万行。

使用RMySQL和函数dbWriteTable似乎是最直接的解决方案。我使用RevolutionR的3.1.1版本(8.0 beta)。操作系统是Win7 x64。

MariaDB中的表格有两列:IDVALUE,其名称为TAB。要存储的数据位于对象data.tab中。

我做什么

我按照以下步骤进行:

data.tab <- data.frame(ID = c(1:3), VAL = c(7:9))
db.con <- dbConnect(drv = MySQL(), user = "root", password = "myPasswrd", dbname="myDBname")
dbWriteTable(conn = db.con, name = "TAB", value = data.tab, append=TRUE, row.names=FALSE, field.types=character(ID="INT",VAL="FLOAT"))

或等效地,通过我创建的临时csv文件:

dbWriteTable(conn = db.con, name = "TAB", value = 'tmp.csv', append=TRUE, row.names=FALSE, field.types=character(ID="INT",VAL="INT"))

问题

调用上面代码段中的第二行会导致抛出以下错误:

Error in .local(conn, statement, ...) : 
sdbi114c7f07039' not found (Errcode: 22)tempRtmpE9YwdP

调用第三行(通过临时csv文件)会导致类似的错误,其中路径使用反斜杠打印出来。结果证明这与路径扩展有关。调试和打印statement会产生:

“LOAD DATA LOCAL INFILE”C:\\ TEMP \\ Rtemp \\ RtmpE9YwdP \\ rsdbi114c7f07039'INTO TABLE TAB由'\ n'终止的行(IDVALUE );“

因此似乎反斜杠(\\)和\r的转义似乎是问题所在。不幸的是,我不知道如何处理这个问题。

追踪(在通话顺序中):

1: dbWriteTable(conn = db.con, name = "t_ftr", value = fut.tbl, append = TRUE, row.names = FALSE,
2: .valueClassTest({standardGeneric("dbWriteTable")}, "logical", "dbWriteTable")
3: is(object, Cl)
4: is(object, Cl)
5: .local(conn, name, value, ...)
6: dbGetQuery(conn, sql)
7: dbGetQuery(conn, sql)
8: dbSendQuery(conn, statement, ...)
9: .valueClassTest(standardGeneric("dbSendQuery"), "DBIResult", "dbSendQuery")
10: is(object, Cl)
11: is(object, Cl)
12: .local(conn, statement, ...)
13: .Call(RS_MySQL_exec, conn@Id, as.character(statement))

修改

如果在statement中步骤11的交互式调试器中,我将\\替换为路径中的/,则数据将正确写入数据库。

1 个答案:

答案 0 :(得分:1)

似乎是RMySQL中的一个问题。我修复了这个问题,并在GitHub上提交了一个拉取请求:

https://github.com/rstats-db/RMySQL/issues/29

对我来说,它现在可以在我的电脑上使用。您可以编译并安装the development version from GitHub,或者等到CRAN上发布新版本的软件包。

编辑:它现在在CRAN上,版本0.10.1