如何使用 osx(和 windows VM)使用 R + DBI +ODBC 连接到 Teradata 数据库

How to connect to Teradata Database using R + DBI +ODBC with osx (and windows VM)

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

我正在尝试使用带有 DBI 库的 R 在我的 Mac 和 Windows VM 上连接到 Teradata 数据库(这样我就可以使用 dbplyr)。在我的 Windows VM 上一切正常(请参阅我之前的问题:)。

我再次怀疑 driver 问题,但我不确定。我确定我上周有这个工作,但我不记得了。我知道我已经更新了 Mac.


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

看我的ODBC管理员截图 和 drivers

我从 Teradata

下载了 Mac 的 ODBC driver

我使用 R 版本 3.5.1 (2018-07-02) 和 teradata driver 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 文件的两个位置。

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

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

例如,我无法将 symlinks 创建到 /etc/ 文件夹中,我收到错误消息:

现在我得到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 管理员 > Drivers 选项卡

您 运行 的 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 文件中的 full [name_name] DSN 定义来构建无 DSN 的 ODBC 连接字符串来获得成功接听您的 DBI::dbConnect() 电话。

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