【问题标题】:What can be reasons for `Error in .local(conn, statement, ...)´ in dbWriteTable from package MonetDB.R?MonetDB.R 包中的 dbWriteTable 中的“.local(conn, statement, ...) 中的错误”可能是什么原因?
【发布时间】:2013-10-13 10:25:09
【问题描述】:

在我设置 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

错误似乎源于字符串值太长(感谢@Hannes Mühleisen):

>dbGetException(conn)
$errNum
[1] 22001

$errMsg
[1] "value too long for type (var)char(255)"

MonetDB 如何设置新 (VAR)CHAR 变量的上限(我在文档中没有找到有关上限的任何信息)?在通过 MonetDB.R 从 R 创建表时,是否可以设置全局上限或交互设置上限?

【问题讨论】:

标签: r monetdb


【解决方案1】:

这可能是超时问题(dbConnect() 的参数)。如果你想调试,你可以运行

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")

在 src/monetdb.R 中使用 R CMD INSTALL 安装包之前。 R-forge 版本也将很快更新,请在 https://r-forge.r-project.org/R/?group_id=1534 查找 0.8.1 版

【讨论】:

  • 谢谢@Hannes,错误不再出现。然而,现在出现了一个新错误:`$errNum [1] 42000 $errMsg [1] "syntax error, unexpected IDENT, expecting ')' or ',' in: \"insert into table1 values([... ]\""´
  • 恐怕我不能,因为数据是机密的。我现在切换到 RSQLite,但会尽快与 MonetDB 联系。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 2014-10-08
  • 2022-07-01
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多