我在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:
查看我的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.ini
和odbcinst.ini
,但它们完全为空/etc/
既没有odbc.ini
也没有odbcinst.ini
我还查看了@TallTed建议的DBI库外观:
/Users/*/Library/ODBC
同时具有odbc.ini
和odbcinst.ini
。 odbc.ini
充满了信息,而odbcinst.ini
没有太多信息。/Library/ODBC/
只有odbcinst.ini
充满信息,还有一个名为ODBCDataSources
的空文件夹(不确定其中是否存在隐藏文件)。/Users/*/.odbc.ini
不存在,我无法打开/Users/*/.odbcinst.ini
到目前为止,我在/usr/local/etc/
中删除了odbcinst.ini
和odbc.ini
并创建了以下符号链接:
ln -s /Users/*/Library/ODBC/odbc.ini /usr/local/etc
ln -s /Library/ODBC/odbcinst.ini /usr/local/etc
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管理器>驱动程序选项卡
答案 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 }}。
或者,您可以将后一个文件的(大部分)内容移到前一个文件中,并用与其他文件的符号链接替换后一个文件,以使两个驱动程序管理器都使用相同的配置文件-即使某些应用并且某些驱动程序只能与一个驱动程序管理器一起使用。