RMySQL dbWriteTable 在 Windows 7 x64 上遇到文件路径问题
RMySQL dbWriteTable runs into problems with file path on Windows 7 x64
设置
我运行 MariaDB 5.5 的本地实例,我在其中创建了一个包含两个 table 的数据库。我必须用存储在几千个 .RData
文件中的数据来填充这些 table。每个文件存储 data.frames
几千到一百万多行。
使用 RMySQL
和函数 dbWriteTable
似乎是最直接的解决方案。我使用 RevolutionR 的 3.1.1 版本(8.0 测试版)。操作系统为Win7 x64.
MariaDB中的table有两列: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
LINES TERMINATED BY '\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 步的交互式调试器中,我将路径中的 \
替换为 /
,则数据将正确写入数据库。
似乎是 RMySQL 中的问题。我解决了这个问题并在 GitHub:
上提交了拉取请求
https://github.com/rstats-db/RMySQL/issues/29
对我来说,它现在可以在我的电脑上运行了。您可以编译安装the development version from GitHub,也可以等CRAN上发布新版本的包。
编辑:它现在在 CRAN 上,版本 0.10.1
设置
我运行 MariaDB 5.5 的本地实例,我在其中创建了一个包含两个 table 的数据库。我必须用存储在几千个 .RData
文件中的数据来填充这些 table。每个文件存储 data.frames
几千到一百万多行。
使用 RMySQL
和函数 dbWriteTable
似乎是最直接的解决方案。我使用 RevolutionR 的 3.1.1 版本(8.0 测试版)。操作系统为Win7 x64.
MariaDB中的table有两列: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
LINES TERMINATED BY '\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 步的交互式调试器中,我将路径中的 \
替换为 /
,则数据将正确写入数据库。
似乎是 RMySQL 中的问题。我解决了这个问题并在 GitHub:
上提交了拉取请求https://github.com/rstats-db/RMySQL/issues/29
对我来说,它现在可以在我的电脑上运行了。您可以编译安装the development version from GitHub,也可以等CRAN上发布新版本的包。
编辑:它现在在 CRAN 上,版本 0.10.1