我运行MariaDB 5.5的本地实例,在那里我创建了一个有两个表的数据库。我必须使用存储在几千个.RData
文件中的数据填充这些表。每个文件存储data.frames
,其中包含几千到一百万行。
使用RMySQL
和函数dbWriteTable
似乎是最直接的解决方案。我使用RevolutionR的3.1.1版本(8.0 beta)。操作系统是Win7 x64。
MariaDB中的表格有两列:ID
和VALUE
,其名称为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'终止的行(ID
,VALUE
);“
因此似乎反斜杠(\\
)和\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的交互式调试器中,我将\\
替换为路径中的/
,则数据将正确写入数据库。
答案 0 :(得分:1)
似乎是RMySQL中的一个问题。我修复了这个问题,并在GitHub上提交了一个拉取请求:
https://github.com/rstats-db/RMySQL/issues/29
对我来说,它现在可以在我的电脑上使用。您可以编译并安装the development version from GitHub,或者等到CRAN上发布新版本的软件包。
编辑:它现在在CRAN上,版本0.10.1