-->

有什么可以从包装MonetDB.R中。本地原因`错误(康涅狄格州,声明,...)“在dbWriteT

2019-10-18 18:46发布

我得到的错误后,我成立了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表时的上限被设定交互?

Answer 1:

这可能是一个超时问题(参数数据库连接())。 如果您想进行调试,可以运行

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?
标签: r monetdb