【问题标题】:dbplyr copy_to not saving table to databasedbplyr copy_to 不将表保存到数据库
【发布时间】:2018-01-10 19:43:26
【问题描述】:

我正在尝试将本地数据框从 R 复制到我的 db2 数据库。我有权写入表,并且我已验证连接正常。

我正在使用:

copy_to(connection, data.frame, name = my_table_name)

我收到以下错误,这对我来说没有意义。它说的对象不存在正是我要创建的对象。我做错了什么?

typeof(x) 中的错误:找不到对象“my_table_name”

【问题讨论】:

  • 尝试 copy_to(connection, data.frame, name = "my_table_name")
  • @DMC 感谢您的回复。这似乎绕过了原来的错误,但是出现了一个新错误:new_result(connection@ptr, statement) 中的错误:nanodbc/nanodbc.cpp:1344:42000:[IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0104 - 临时令牌无效。有效令牌:SUMMARY。
  • @DMC 这个错误是因为我要复制的表的大小而产生的吗?
  • 提到“令牌”的事实表明这是一个权限问题

标签: r dplyr tidyverse dbplyr


【解决方案1】:

默认情况下,copy_to() 会尝试创建一个临时表。一个选项是添加参数temporary = FALSE,以克服TEMPORARY 令牌错误。一个更好的解决方案是用于连接的包,希望是odbc 包,它可以添加对 DB2 数据库的支持。换句话说,odbc 需要知道正确创建临时表所需的具体命令是什么。解决此问题后,copy_to() 将起作用。如果确实是您使用的 odbc 包,我建议您在包的存储库中打开 GitHub 问题。

【讨论】:

  • 我只需要添加 copy_to(..., temporary=FALSE) 就可以了,谢谢!
【解决方案2】:

这可能是由 DBI 而不是 dbplyr 的问题引起的。见here。有一个利用DBI 包的变通方法。您可以here了解更多详情。

总结:DBI 包有一个写表命令。它使用相同的连接,但它还要求输入表名包含在SQL() 中。

我测试了以下内容,它按预期工作。

data(iris)
DBI::dbWriteTable(connection, SQL("database.schema.iris"), iris)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多