【问题标题】:Connect to Microsoft SQL database with dplyr 0.7 and R使用 dplyr 0.7 和 R 连接到 Microsoft SQL 数据库
【发布时间】:2017-06-23 18:32:36
【问题描述】:

我正在尝试将dplyr/dbplyr (version 0.7) 与数据库 (Microsoft SQL Server 2014) 一起使用。我已经能够使用RODBCDBIodbc 包连接到它并提取数据。当我尝试将 dplyr 动词直接与基础一起使用时,就会出现问题。

当我尝试使用dplyr 时,我收到以下错误:

Error in new_result(connection@ptr, statement) : std::bad_alloc

我在 dplyr repo 上提出了这个问题,Hadley 告诉我这很可能是 odbc 错误。当我 raisedodbc repo 上的问题时,Jim 非常有帮助,但无法解决问题。

要明确:

RODBC::sqlQuery()DBI::dbGetQuery() 都可以工作:我得到了一个我期望的数据框,我可以使用SQL 查询来取回我想要的任何东西。我只在尝试使用dplyr 动词时遇到内存分配错误(实际上,即使我尝试使用tbl())。有很多数据,但我正在查询其中的一个子集,它很适合 R 内存。

理想情况下,如果可能,我宁愿将数据完全保留在 R 的内存中。这样做的原因是我正在构建一个Shiny 应用程序,它将根据用户选择的数据的各个方面生成绘图等。可以想象,每次用户执行此操作时连接到数据库、发送查询和接收数据都会使应用程序有些无用,因为它太慢了。我的理想情况就像RStudio 示例:

my_db <- src_mysql(
  dbname = "shinydemo",
  host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
  user = "guest",
  password = "guest"
)

> my_db %>% tbl("City") %>% head(5)
# Source:   lazy query [?? x 5]
# Database: mysql 10.0.17-MariaDB [guest@shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com:/shinydemo]
     ID           Name CountryCode      District Population
  <dbl>          <chr>       <chr>         <chr>      <dbl>
1     1          Kabul         AFG         Kabol    1780000
2     2       Qandahar         AFG      Qandahar     237500
3     3          Herat         AFG         Herat     186800
4     4 Mazar-e-Sharif         AFG         Balkh     127800
5     5      Amsterdam         NLD Noord-Holland     731200

但是,以我的基地,我无法做到这一点。 非常感谢任何帮助。

【问题讨论】:

标签: r database dplyr dbplyr


【解决方案1】:

叹息。 (任何遇到类似情况的人都可以回答。)

原来这是我尝试访问的特定表的问题。

这个表在RODBCDBI/odbc 上没有问题,但只要我使用dplyr,它就会吐出这个错误。

数据库中的其他表与dplyr 一起工作正常,因此它必须与此特定表有关。更糟糕的是,我不知道为什么。

【讨论】:

  • 亲爱的罗伯特,您能分享一下您正在使用的“dplyr”查询吗?与查询分开,我的感觉是检查您正在检索的列数据。它可能是数据中的一个不寻常的值。我为什么这么说?我在过去看到过类似的事情。结果发现列中的一个值正在被检索和转换,这导致查询被炸毁。只是一个想法。祝调试顺利。
  • @Technophobe01 谢谢!看看 odbc repo 上的这个线程:https://github.com/rstats-db/odbc/issues/71——我们详细介绍了试图找出问题所在。我很确定它只与一列有关,但是我与 dplyr 的 tbl() 一起使用的任何 SQL 查询在处理事情之前似乎都不会忽略此列,所以即使尝试使用 SELECT 也会出现错误列(而不是这一列)。感谢任何 SQL 建议!
  • 罗伯特,我读了线程(odbc repo:github.com/rstats-db/odbc/issues/71)我的直觉是你在引用的列中有一个特殊的字符编码错误。列类型是 ASCII 还是 Unicode?为什么,我要说这个?列数据不是英文的,因此它看起来(至少在我看来)列数据中嵌入了特殊字符。我的方法是在操作之前重新格式化列数据条目或转换数据。希望这会有所帮助。
  • 谢谢 Technophobe,我认为这是类似的事情,我会看看如何改变它。
【解决方案2】:

我遇到了与 Sybase 非常相似的问题。我的问题与odbcDBI 包完全无关。

我的解决方案是确保我使用的是支持 8 字节 SQLLEN 数据类型的 ODBC 驱动程序。在 Linux 上运行命令 odbcinst -j 向我显示 SQLLEN 大小为 8,我安装的 unixODBC 版本 2.3.1 在 RHEL Server 7.5 64 位上运行。

默认情况下,Sybase 驱动程序符号链接到 4 字节版本。按照下面的说明,我确保我链接到了 8 字节版本并且我的问题得到了解决。奇怪的是,我在通过isql 发出命令时从未遇到过这些问题,但是......也许这适用于带有 SQL Server 的@robertmc。

http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc20155.1600/doc/html/san1361915533650.html

在相关的 GitHub 问题之一中也发布了此内容: https://github.com/r-dbi/odbc/issues/174#issuecomment-403106647

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多