#r #mysql-odbc-connector
#r #mysql-odbc-connector
Вопрос:
ПРИВЕТ, я использую R и хочу сохранить табличные представления в ch, но это не работает
У меня есть файл dsn, сохраненный в каталоге с именем dsnfiles:
ch <- odbcConnect("S:/dsnfiles/databasex.dsn")
sqlTables(ch)
Пожалуйста, вы можете мне помочь? Этот код не работает.
Спасибо
A
Комментарии:
1. Файл DSN обычно представляет собой просто текстовый файл с определенными свойствами. Если вы можете вставить содержимое этого файла (отредактированное для PII / auth), это может быть полезно. Однако я никогда не использовал файл DSN, предпочитая либо прямые параметры, либо строку DSN. (Я также использую
DBI
/odbc
а неRODBC
так, как кажется, что вы используете здесь. Я не верю, что это меняет проблемы, с которыми вы сталкиваетесь.)2. Как мне использовать строку dsn? В sas это «подключиться к odbc (noprompt=’filedsn= S:dsnfiles databasex.dsn;’);» а в stata это «загрузка odbc, таблица (x) нижняя очистить строку подключения («FILEDSN = S: dsnfiles databasex.dsn»)»
Ответ №1:
Файлы DSN обычно хранятся на системном уровне, поэтому обычно это не произвольные файлы, подобные этому. Я считаю, что odbc
пакет поддерживает произвольные файлы в macos и Linux (не Windows), но я не тестировал это RODBC
. Сказав это, нетрудно проанализировать этот файл и получить то, что вам нужно.
Для моей конфигурации у меня есть экземпляр SQL Server, запущенный на моем локальном хосте, порт 21433.
Я создал файл DSN с именем "~/StackOverflow/14549856/somedatabase.dsn"
со следующим содержимым:
[ODBC]
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword
(при необходимости замените uid / pwd).
Я предполагаю, что, поскольку вы просто ссылаетесь на один файл без каких-либо других условий, нужная вам запись ( [ODBC]
в моем примере) является единственной записью в файле, поэтому я начну с этого. Если у вас есть какие-либо искаженные записи, пустые строки или комментарии в этом файле, вам может потребоваться немного больше поработать с форматированием строки подключения здесь.
Итак, давайте преобразуем этот файл в «строку подключения» (вот хорошая ссылка для этих строк: https://www.connectionstrings.com /).
connstr <- paste(trimws(readLines("~/StackOverflow/14549856/somedatabase.dsn")[-1]), collapse = ";")
connstr
# [1] "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,21433;UID=myusername;PWD=mypassword"
( [-1]
Избавляется от [ODBC]
заголовка. Мы используем все остальные строки.)
Мы можем использовать это непосредственно в открывающем вызове:
rcon <- RODBC::odbcDriverConnect(connection = connstr)
RODBC::sqlQuery(rcon, "select 2 as two")
# two
# 1 2
RODBC::odbcClose(rcon)
Возможно (даже вероятно), что ваш файл DSN содержит больше, чем этот пример. Если есть несколько записей (например, [ODBC]
и [SomeOtherODBC]
), то вам потребуется немного больше работы. Ниже приведен пример, который может сработать (может и нет, в зависимости от комментариев и т. Д.).
Новое содержимое файла DSN:
[ODBC]
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,21433
UID=myusername
PWD=mypassword
[ODBC2]
DRIVER=ODBC Driver 17 for SQL Server
TrustServerCertificate=Yes
DATABASE=mydbname
WSID=d2sb2
SERVER=127.0.0.1,31433
UID=myusername2
PWD=mypassword2
dsnfile <- readLines("~/StackOverflow/14549856/somedatabase.dsn")
dsnfile <- split(dsnfile, cumsum(grepl("^[[:space:]]*\[", dsnfile)))
dsnnames <- sapply(dsnfile, function(dsn) trimws(gsub("[][[:space:]]", "", dsn[1])))
dsnfile <- lapply(setNames(dsnfile, dsnnames), function(dsn) paste(trimws(dsn[-1]), collapse = ";"))
str(dsnfile)
# List of 2
# $ ODBC : chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,2"| __truncated__
# $ ODBC2: chr "DRIVER=ODBC Driver 17 for SQL Server;TrustServerCertificate=Yes;DATABASE=mydbname;WSID=d2sb2;SERVER=127.0.0.1,3"| __truncated__
rcon <- RODBC::odbcDriverConnect(connection = dsnfile[["ODBC"]])
RODBC::sqlQuery(rcon, "select 3 as three")
# three
# 1 3
RODBC::odbcClose(rcon)
Комментарии:
1. Вы удивительный мастер!!! Ваш код решил мою проблему!!!!