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

时间:2019-01-30 07:27:16

标签: r odbc teradata r-dbi

我在Mac上工作,但也有Windows VM。

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

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


背景: 首先,这是我的ODBC信息,如果我看它是ODBC Administrator:

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

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

我从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管理器>驱动程序选项卡

1 个答案:

答案 0 :(得分:1)

您正在运行的ODBC管理器正在使用iODBC Driver Manager(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 Driver Manager构建的,后者查找不同的默认位置-

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

您可以通过使用在相关[name_name]文件中找到的 full odbc.ini DSN定义来为您的{{1 }}。

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