Как подключиться к базе данных Teradata, используя R + DBI + ODBC с osx (и Windows VM) - PullRequest
0 голосов
/ 30 января 2019

Я работаю на Mac, но у меня также есть виртуальная машина Windows.

Я пытаюсь подключиться к базе данных Teradata на моем Mac и Windows VM, используя R с библиотекой DBI (поэтому я могу использовать dbplyr).На моей виртуальной машине Windows все работает отлично (см. Мой предыдущий вопрос: Подключение к базе данных Teradata с использованием библиотеки R + DBI + ODBC ).

Снова я подозреваю, что проблема с драйвером, но я неконечно.Я уверен, что у меня была эта работа на прошлой неделе, но я не могу вспомнить.Я знаю, что обновил свой Mac.


Справочная информация. Сначала приведу информацию о ODBC, если я посмотрю ее. Администратор ODBC:

  • Имя = имя_имя
  • Driver = Teradata
  • Имя или IP-адрес = address.here.ok
  • Механизм = ldap
  • Имя пользователя = my_username

См. Скриншотмой администратор ODBC ODBC administrator и драйверы the drivers

Я загрузил драйвер ODBC для Mac с Teradata

Я использую версию 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.

Я также пробовал другие значения в строке подключения, но безуспешно, как описано здесь , например:

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> вкладка «Драйверы»

1 Ответ

0 голосов
/ 30 января 2019

Администратор ODBC, с которым вы работаете, работает с диспетчером драйверов iODBC (который поставляется с 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

Вы можете добиться успеха, используя определение full [name_name] DSN, как указано в соответствующем файле odbc.ini, для создания ODBC без DSNСтрока подключения для вашего DBI::dbConnect() вызова.

Кроме того, вы можете переместить (большую часть) содержимое последних файлов в первые файлы и заменить последние файлы символическими ссылками на другие, так что оба диспетчера драйверов используют одни и те же файлы конфигурации - дажехотя некоторые приложения и некоторые драйверы будут работать только с одним диспетчером драйверов.

...