【发布时间】: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.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 并创建了以下符号链接:
- (链接到 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“疑难解答”部分