如何访问 R 中的嵌套 SQL 表?
How do I access nested SQL tables in R?
从 R Studio 的 ODBC database documentation 我可以看到一个简单的例子,说明如何将 SQL table 读入 R 数据框:
data <- dbReadTable(con, "flights")
让我粘贴一张 BGBUref
table(?) 我正在尝试读取到 R 数据框的图形。这是我在 R studio 中的连接窗格。
如果我使用与上面相同的语法,其中 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'.
我对"table"的理解有误吗?或者我需要做这样的事情才能到达嵌套的 BGBUref
table:
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"
当使用 dbplyr
时,似乎
df = tbl(con, from = 'BGBUref')
如果大致相当于
USE QnRStore
GO
SELECT * FROM BGBUref;
来自@David_Browne的评论和您拥有的图片:
- 一个 table 名为 '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'))
(我在通过同一连接访问多个数据库时使用这种形式。因为如果在来自不同数据库的 table 之间连接时使用相同的连接,dbplyr
性能最佳。)
一般背景
首先,请考虑阅读关系数据库体系结构,其中 tables 封装在模式中,模式本身封装在数据库中,然后再封装在服务器或集群中。请注意图像中的图标对应于对象类型:
cluster/server < catalog/database < schema/namespace < table
因此,在您的情况下没有嵌套 tables,而是典型的架构:
myserver < QnRStore < dbo < BGBURef
要在 SQL 查询中从服务器级别访问此体系结构,您将使用符合句点的名称:
SELECT * FROM database.schema.table
SELECT * FROM QnRStore.dbo.BGBURef
SQL 服务器的默认架构是 dbo
(相比之下,Postgres 是 public
)。通常,像 R 的 odbc
这样的 DB-API 连接到一个数据库,该数据库允许连接到任何底层模式和相应的 tables,假设连接的用户可以访问此类模式。请注意,此规则不可推广。例如,Oracle 的架构与所有者对齐,MySQL 的数据库与架构同义。
进一步阅读:
- What is the difference between a schema and a table and a database?
- Differences between Database and Schema using different databases?
- Difference between database and schema
- What's the difference between a catalog and a schema in a relational database?
具体案例
因此,要连接到默认架构中的 SQL 服务器数据库 table,只需引用 table、BGBURef
,它假定 table ] 驻留在连接数据库的 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()
写入持久性 tables:
dbWriteTable(con, SQL("myschema.mytable"), mydataframe)
从 R Studio 的 ODBC database documentation 我可以看到一个简单的例子,说明如何将 SQL table 读入 R 数据框:
data <- dbReadTable(con, "flights")
让我粘贴一张 BGBUref
table(?) 我正在尝试读取到 R 数据框的图形。这是我在 R studio 中的连接窗格。
如果我使用与上面相同的语法,其中 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'.
我对"table"的理解有误吗?或者我需要做这样的事情才能到达嵌套的 BGBUref
table:
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"
当使用 dbplyr
时,似乎
df = tbl(con, from = 'BGBUref')
如果大致相当于
USE QnRStore
GO
SELECT * FROM BGBUref;
来自@David_Browne的评论和您拥有的图片:
- 一个 table 名为 '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'))
(我在通过同一连接访问多个数据库时使用这种形式。因为如果在来自不同数据库的 table 之间连接时使用相同的连接,dbplyr
性能最佳。)
一般背景
首先,请考虑阅读关系数据库体系结构,其中 tables 封装在模式中,模式本身封装在数据库中,然后再封装在服务器或集群中。请注意图像中的图标对应于对象类型:
cluster/server < catalog/database < schema/namespace < table
因此,在您的情况下没有嵌套 tables,而是典型的架构:
myserver < QnRStore < dbo < BGBURef
要在 SQL 查询中从服务器级别访问此体系结构,您将使用符合句点的名称:
SELECT * FROM database.schema.table
SELECT * FROM QnRStore.dbo.BGBURef
SQL 服务器的默认架构是 dbo
(相比之下,Postgres 是 public
)。通常,像 R 的 odbc
这样的 DB-API 连接到一个数据库,该数据库允许连接到任何底层模式和相应的 tables,假设连接的用户可以访问此类模式。请注意,此规则不可推广。例如,Oracle 的架构与所有者对齐,MySQL 的数据库与架构同义。
进一步阅读:
- What is the difference between a schema and a table and a database?
- Differences between Database and Schema using different databases?
- Difference between database and schema
- What's the difference between a catalog and a schema in a relational database?
具体案例
因此,要连接到默认架构中的 SQL 服务器数据库 table,只需引用 table、BGBURef
,它假定 table ] 驻留在连接数据库的 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()
写入持久性 tables:
dbWriteTable(con, SQL("myschema.mytable"), mydataframe)