Как получить доступ к вложенным таблицам SQL в R? - PullRequest
0 голосов
/ 08 октября 2019

Из документации базы данных ODBC R Studio. Я могу видеть простой пример того, как читать таблицу SQL во фрейм данных R:

data <- dbReadTable(con, "flights")

Позвольте мне вставить рисунокBGBUref таблица (?) Я пытаюсь прочитать данные фрейма R. Это из моей панели соединений в R studio.

nested table

Если я использую тот же синтаксис, что и выше, где con - это вывод моего dbConnect(...) Я получаю следующее:

df <- dbReadTable(con, "BGBURef")
#> Error: <SQL> 'SELECT * FROM "BGBURef"' nanodbc/nanodbc.cpp:1587: 42S02: 
#> [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name
#> 'BGBURef'.

Правильно ли я понимаю, что «таблица» неверна? Или мне нужно сделать что-то подобное, чтобы попасть во вложенную таблицу BGBUref:

df <- dbReadTable(con, "QnRStore\dbo\BGBURef")
#> Error: '\d' is an unrecognized escape in character string starting ""QnRStore\d"

Фрейм данных BGBUref появится в R Studio, если я нажму на маленький значок электронной таблицы. Я просто не могу понять, как поместить его в определенный фрейм данных, в моем случае df.


Вот вывод, когда я запускаю эти команды:

df <- dbReadTable(con, "QnRStore")
#> Error: <SQL> 'SELECT * FROM "QnRStore"'
#> nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC Driver 17 for SQL 
#> Server][SQL Server]Invalid object name 'QnRStore'. 

и:

dbListTables(con)
#>  [1] "spt_fallback_db"                                         
#>  [2] "spt_fallback_dev"                                        
#>  [3] "spt_fallback_usg"                                        
#>  [4] "spt_monitor"                                             
#>  [5] "trace_xe_action_map"                                     
#>  [6] "trace_xe_event_map"                                      
#>  [7] "spt_values"                                              
#>  [8] "CHECK_CONSTRAINTS"                                       
#>  [9] "COLUMN_DOMAIN_USAGE"                                     
#> [10] "COLUMN_PRIVILEGES" 
#> ...
#> [650] "xml_schema_types"                                        
#> [651] "xml_schema_wildcard_namespaces"                          
#> [652] "xml_schema_wildcards"

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Общая информация

Прежде всего, подумайте о чтении архитектуры реляционных баз данных, в которой таблицы инкапсулированы в схемы, которые сами инкапсулированы в базы данных, которые затем инкапсулируются в серверы или кластеры. Обратите внимание, что значки на вашем изображении соответствуют типу объекта:

cluster/server < catalog/database < schema/namespace < table

Следовательно, в вашей ситуации нет вложенных таблиц, но есть типичная архитектура:

myserver < QnRStore < dbo < BGBURef

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

SELECT * FROM database.schema.table

SELECT * FROM QnRStore.dbo.BGBURef

Схема по умолчанию для SQL Server - dbo (для сравнения для Postgres - public). Обычно DB-API, такие как R odbc, подключаются к базе данных, которая позволяет подключаться к любым базовым схемам и соответствующим таблицам, при условии, что подключенный пользователь имеет доступ к таким схемам. Обратите внимание, что это правило не обобщается. Например, схема Oracle совпадает с владельцем, а база данных MySQL является синонимом схемы.

См. Также:


Особый случай

Поэтому, чтобы подключиться к таблице базы данных SQL Server в схеме по умолчанию, просто обратитесь к таблице BGBURef, которая предполагает, что таблица находится в схеме dboвашей подключающейся базы данных.

df <- dbReadTable(con, "BGBURef")

Если вы используете схему не по умолчанию, вам нужно будет указать ее соответственно, что в последнее время вы можете сделать с DBI::Id и можете использовать ее аналогично для dbReadTable и dbWriteTable:

s <- Id(schema = "myschema", table = "mytable")

df <- dbReadTable(con, s)

dbWriteTable(conn, s, mydataframe)

Кроме того, вы можете запустить требуемый период SQL-запроса:

df <- dbGetQuery(con, "SELECT * FROM [myschema].[mytable]")

И вы можете использовать SQL() для записи в постоянные таблицы:

dbWriteTable(con, SQL("myschema.mytable"), mydataframe)
1 голос
/ 08 октября 2019

При использовании dbplyr получается, что

df = tbl(con, from = 'BGBUref')

, если примерно эквивалентно

USE QnRStore
GO

SELECT * FROM BGBUref;

Из комментария @ David_Browne и изображения, которое выглядит так, как у вас:

  • Таблица с именем 'BGBUref'
  • В схеме с именем 'dbo'
  • В базе данных с именем 'QnRStore'

В этом случае вынужна команда in_schema.

Если ваше подключение (con) к базе данных QnRStore, попробуйте следующее:

df = tbl(con, from = in_schema('dbo', 'BGBUref'))

Если ваше подключение (con)не напрямую к базе данных QnRStore, тогда это может работать:

df = tbl(con, from = in_schema('QnRStore.dbo', 'BGBUref'))

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

...