如何使用 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 管理员那里查看它:
- 姓名=name_name
- Driver = Teradata
- 名称或 IP 地址 = address.here.ok
- 机制 = ldap
- 用户名=my_username
看我的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 文件的两个位置。
/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
并创建了以下符号 links:
- (link 到 odbc.ini 文件)
ln -s /Users/*/Library/ODBC/odbc.ini /usr/local/etc
- (link 到 odbcinst.ini 文件)
ln -s /Library/ODBC/odbcinst.ini /usr/local/etc
- (link 到 ODBCDataSources 文件夹)
ln -s /Library/ODBC/ODBCDataSources /usr/local/etc
例如,我无法将 symlinks 创建到 /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 管理员 > 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()
电话。
或者,您可以将后一个文件的(大部分)内容移动到前一个文件中,并用指向其他文件的符号链接替换后一个文件,这样两个驱动程序管理器都使用相同的配置文件——即使某些应用程序和某些驱动程序只能与一个驱动程序管理器一起使用。
我在 Mac 上工作,但也有一个 windows 虚拟机。
我正在尝试使用带有 DBI 库的 R 在我的 Mac 和 Windows VM 上连接到 Teradata 数据库(这样我就可以使用 dbplyr)。在我的 Windows VM 上一切正常(请参阅我之前的问题:
我再次怀疑 driver 问题,但我不确定。我确定我上周有这个工作,但我不记得了。我知道我已经更新了 Mac.
背景: 首先这是我的 ODBC 信息,如果我在 ODBC 管理员那里查看它:
- 姓名=name_name
- Driver = Teradata
- 名称或 IP 地址 = address.here.ok
- 机制 = ldap
- 用户名=my_username
看我的ODBC管理员截图
我从 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 文件的两个位置。
/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
并创建了以下符号 links:
- (link 到 odbc.ini 文件)
ln -s /Users/*/Library/ODBC/odbc.ini /usr/local/etc
- (link 到 odbcinst.ini 文件)
ln -s /Library/ODBC/odbcinst.ini /usr/local/etc
- (link 到 ODBCDataSources 文件夹)
ln -s /Library/ODBC/ODBCDataSources /usr/local/etc
例如,我无法将 symlinks 创建到 /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 管理员 > 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()
电话。
或者,您可以将后一个文件的(大部分)内容移动到前一个文件中,并用指向其他文件的符号链接替换后一个文件,这样两个驱动程序管理器都使用相同的配置文件——即使某些应用程序和某些驱动程序只能与一个驱动程序管理器一起使用。