Подключиться к БД с помощью DBplyr - PullRequest
0 голосов
/ 08 мая 2020

Проблема

Я пытаюсь подключиться к SQL серверу, который находится в помещении, с помощью dbplyr, используя инструкции здесь , но я продолжаю получать сообщение об ошибке:

Недействительное имя объекта

Для простоты я использую то же соглашение об именах объектов, что и RStudio в инструкциях по ссылке выше.

Код, вызывающий ошибку

Я использую dbConnect для установки sh соединения:

con <- dbConnect(odbc::odbc(),
             .connection_string = "Driver={SQL Server};server=DO1COMMONSQL01\\COMMON1D;database=datawarehouse;trusted_connection=Yes",
             timeout = 10)

Я знаю, что все прошло успешно, потому что я вижу БД и ее таблицы на вкладке подключений.

Затем я go для вызова простого канала с использованием dbplyr:

tbl(con, 'mtcars') %>%
  summarise(Count = n())

Это точка, в которой я получаю сообщение об ошибке:

Ошибка: nanodbc / nanodb c. cpp: 1617: 42000: [Microsoft] [ODB C SQL Драйвер сервера] [SQL Сервер] Недопустимое имя объекта «mtcars».

Я пробовал другие вариации на тему, такие как tbl(con, 'dbo.mtcars')... или tbl(con, 'datawarehouse.dbo.mtcars'...), но безуспешно.

1 Ответ

0 голосов
/ 08 мая 2020

В приведенном вами примере mtcars - это таблица в datawarehouse. Я предполагаю, что mtcars находится в базе данных, к которой вы подключаетесь. Но вы можете проверить это, используя:

'mtcars' %in% DBI::dbListTables(con)

Если вы хотите запросить таблицу в определенной c базе данных или схеме (не по умолчанию), вам нужно использовать in_schema.

Без in_schema:

tbl(con, 'dbo.mtcars')

Создает запрос sql, например:

SELECT *
FROM "dbo.mtcars"

Где имена разделителей ". Итак, в этом случае SQL ищет таблицу с именем dbo.mtcars, а не таблицу с именем mtcars в dbo.

С in_schema:

tbl(con, in_schema('dbo','mtcars'))

Создает sql запрос типа:

SELECT *
FROM "dbo"."mtcars"

Итак, в этом случае SQL ищет таблицу с именем mtcars в dbo. Потому что каждый термин " цитируется отдельно.

...