【问题标题】:How to connect to Teradata Database using R + DBI +ODBC with osx (and windows VM)如何使用带有 osx(和 windows VM)的 R + DBI +ODBC 连接到 Teradata 数据库
【发布时间】:2019-06-23 10:06:32
【问题描述】:

我在 Mac 上工作,但也有一个 Windows 虚拟机。

我正在尝试使用带有 DBI 库的 R 连接到我的 Mac 和 Windows VM 上的 Teradata 数据库(因此我可以使用 dbplyr)。在我的 Windows VM 上一切正常(请参阅我之前的问题:Connect to Teradata Database using R + DBI library + ODBC)。

我再次怀疑是驱动程序问题,但我不确定。我确定我上周有这个工作,但我不记得了。我知道我已经更新了我的 Mac。


背景: 如果我查看 ODBC 管理员,首先这是我的 ODBC 信息:

  • 姓名 = name_name
  • 驱动程序 = Teradata
  • 名称或 IP 地址 = address.here.ok
  • 机制 = ldap
  • 用户名 = 我的用户名

查看我的 ODBC 管理员的屏幕截图 和司机

我从Teradata下载了适用于 Mac 的 ODBC 驱动程序

我使用 R 版本 3.5.1 (2018-07-02) 和 teradata 驱动程序 16.20。


有效的方法(在 Mac 和 Windows 上): 库(RODBC)

con = odbcConnect(dsn = "name_name"
                  ,uid = rstudioapi::askForPassword("Username")
                  ,pwd = rstudioapi::askForPassword("Password")
                  )

什么在 Mac 上不起作用(但在 Windows 上起作用)

con = DBI::dbConnect(odbc::odbc()
                  ,dsn = "name_name"
                  ,uid = rstudioapi::askForPassword("Username")
                  ,pwd = rstudioapi::askForPassword("Password")
                  )

在 Mac 上,我收到错误 Error: nanodbc/nanodbc.cpp:950: IM002: [unixODBC][Driver Manager]Data source name not found, and no default driver specified

我还尝试了我的连接字符串中的其他值,但没有运气,如 here 所述,例如:

con = DBI::dbConnect(odbc::odbc()
                  ,Driver = "Teradata"
                  ,Host = "address.here.ok"
                  ,DBName = "name_name"
                  ,uid = rstudioapi::askForPassword("Username")
                  ,pwd = rstudioapi::askForPassword("Password")
                  )

提前谢谢你。

编辑:更新

根据@TallTed 的建议,我检查了 DBI 将“查找”odbc 文件的两个位置。

  • /usr/local/etc/ 目录有文件 odbc.iniodbcinst.ini 但它们完全是空的
  • /etc/ 既没有 odbc.ini 也没有 odbcinst.ini

我还查看了@TallTed 建议 DBI 库的位置:

  • /Users/*/Library/ODBC 同时具有 odbc.iniodbcinst.iniodbc.ini 填的是信息,odbcinst.ini 没有太多信息。
  • /Library/ODBC/只有odbcinst.ini,里面填满了信息,还有一个空文件夹ODBCDataSources(不知道里面有没有隐藏文件)。
  • /Users/*/.odbc.ini 存在,里面什么都没有,我无法打开 /Users/*/.odbcinst.ini

到目前为止,在 /usr/local/etc/ 中,我删除了 odbcinst.iniodbc.ini 并创建了以下符号链接:

  • (链接到 odbc.ini 文件)ln -s /Users/*/Library/ODBC/odbc.ini /usr/local/etc
  • (链接到 odbcinst.ini 文件)ln -s /Library/ODBC/odbcinst.ini /usr/local/etc
  • (链接到 ODBCDataSources 文件夹)ln -s /Library/ODBC/ODBCDataSources /usr/local/etc

例如,我无法在 /etc/ 文件夹中创建符号链接,但出现错误:

  • ln: /etc/odbc.ini: Permission denied

现在我得到Error: nanodbc/nanodbc.cpp:950: HY000: [Teradata][ODBC] (11560) Unable to locate SQLGetPrivateProfileString function.

编辑 2:解决方案

con = DBI::dbConnect(odbc::odbc()
               ,driver = "/Library/Application Support/teradata/client/16.20/lib/tdataodbc_sbu.dylib"
               ,DBCName = "address.goes.here"
               ,MechanismName = "ldap"
               ,uid = rstudioapi::askForPassword("Username")
               ,pwd = rstudioapi::askForPassword("Password"))

路径 /Library/Application Support/teradata/client/16.20/lib/tdataodbc_sbu.dylib 只是来自 ODBC 管理器 > 驱动程序选项卡

【问题讨论】:

  • 请注意,当您收到错误Error: nanodbc/nanodbc.cpp:950: HY000: [Teradata][ODBC] (11560) Unable to locate SQLGetPrivateProfileString function. 时,“驱动程序管理器的库文件的名称与默认值不同”。请参阅Teradata - Specifying ODBC Driver Managers's“疑难解答”部分

标签: r odbc teradata r-dbi


【解决方案1】:

您正在运行的 ODBC 管理器与 iODBC 驱动程序管理器(Apple 随 macOS 一起提供)一起工作。 iODBC 查找 ODBC 配置的特定默认位置 --

/Library/ODBC/odbc.ini
/Library/ODBC/odbcinst.ini
/Users/*/Library/ODBC/odbc.ini
/Users/*/Library/ODBC/odbcinst.ini
/Users/*/.odbc.ini -> /Users/*/Library/ODBC/odbc.ini
/Users/*/.odbcinst.ini -> /Users/*/Library/ODBC/odbcinst.ini

根据您报告的成功和失败,RODBC 显然是针对 iODBC 构建的,但 DBI 显然是针对 unixODBC 驱动程序管理器构建的,它查看不同的默认位置 --

/etc/odbc.ini
/etc/odbcinst.ini
/usr/local/etc/odbc.ini
/usr/local/etc/odbcinst.ini

您可以通过使用相关odbc.ini 文件中的完整 [name_name] DSN 定义为您的DBI::dbConnect() 调用构造一个无DSN 的ODBC 连接字符串来获得成功。

或者,您可以将后一个文件的(大部分)内容移动到前一个文件中,并用指向其他文件的符号链接替换后一个文件,以便两个驱动程序管理器使用相同的配置文件——即使某些应用程序并且某些驱动程序只能与一个驱动程序管理器一起使用。

【讨论】:

  • 再次感谢@TallTed 我现在就试一试。我真的很感谢你与我分享的一切:)
  • @i_love_chocolate - 请注意,我已经稍微更新了我的答案。基本建议保持不变,但有关 RODBC 和 DBI 的一些细节发生了变化。
  • 谢谢,我尝试了符号链接建议,但运气不佳 - 我只能复制到 /usr/local/etc/ 我复制了信息最多的文件。我发布了我在上面所做的。
  • 无 DSN 的 ODBC 连接字符串是什么样的?我尝试输入 .ini 文件的路径,还有这个:con2 = DBI::dbConnect(odbc::odbc(), dsn = "/Library/Application Support/teradata/client/16.10/lib/tdata.dylib", uid = "username", pwd = "password") 并得到 Error: nanodbc/nanodbc.cpp:950: IM012: [unixODBC][Driver Manager]DRIVER keyword syntax error 我超出了我所知道的范围,所以我不确定如何执行每个步骤来解决问题。
  • 另外仅供参考,这听起来与我遇到的问题相似:github.com/r-dbi/odbc/issues/16
猜你喜欢
  • 2019-06-17
  • 2023-03-24
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
  • 2017-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多