我得到的错误后,我成立了MonetDB,并尝试写一个大data.frame作为默认数据库(演示)新表:
>dbWriteTable(conn, "table1", df)
Error in .local(conn, statement, ...) :
Unable to execute statement 'INSERT INTO table1 VALUES([...])
该data.frame的尺寸为:
>dim(df)
[1] 148767 618
并具有格式化为字符的所有列:
>all(lapply(df,class)=='character')
[1] TRUE
该错误似乎从一个字符串值过长(感谢@HannesMühleisen)干:
>dbGetException(conn)
$errNum
[1] 22001
$errMsg
[1] "value too long for type (var)char(255)"
如何MonetDB设置新(VAR)CHAR变量(我没有找到相应文件,上限的任何信息)的上限? 可以在全球的上限设置,或者可以通过MonetDB.R创建自R表时的上限被设定交互?
这可能是一个超时问题(参数数据库连接())。 如果您想进行调试,可以运行
assignInNamespace("DEBUG_IO",TRUE,"MonetDB.R")
前连接。 如果您在此处发表的输出,我可以给你一个更好的想法可能是想错了。 最后,你有没有尝试过寻找的输出
dbGetException(conn)
?
更新:
很抱歉的是,这样做的原因是,dbWriteTable使用字符数据错误的SQL类型。 目前,一个VARCHAR(255)被使用,其被限制为确255个字符。 它应该用的是STRING,它没有限制。 值得注意的是作为一个错误,将被固定在下一版本中。 由于这可能需要一段时间,这里是一个解决办法:如果你从源代码安装,你可以通过改变解决这个问题
setMethod("dbDataType", signature(dbObj="MonetDBConnection", obj = "ANY"), def=function(dbObj, obj, ...) {
if (is.logical(obj)) "BOOLEAN"
else if (is.integer(obj)) "INTEGER"
else if (is.numeric(obj)) "DOUBLE PRECISION"
else if (is.raw(obj)) "BLOB"
else "VARCHAR(255)"
}, valueClass = "character")
至
setMethod("dbDataType", signature(dbObj="MonetDBConnection", obj = "ANY"), def=function(dbObj, obj, ...) {
if (is.logical(obj)) "BOOLEAN"
else if (is.integer(obj)) "INTEGER"
else if (is.numeric(obj)) "DOUBLE PRECISION"
else if (is.raw(obj)) "BLOB"
else "STRING"
}, valueClass = "character")
在安装,使用R CMD安装程序包之前的src / monetdb.R。 在R-锻造建立也将很快更新,寻找0.8.1版本在https://r-forge.r-project.org/R/?group_id=1534
文章来源: What can be reasons for `Error in .local(conn, statement, …)´ in dbWriteTable from package MonetDB.R?