使用 R 列出 Postgres 模式中的表

Mik*_*cer 9 postgresql r

我正在使用 R 和RPostgreSQL包连接到 PostgreSQL 数据库。数据库有许多模式,我想知道哪些表与特定模式相关联。

到目前为止,我已经尝试过:

dbListTables(db, schema="sch2014")
dbGetQuery(db, "dt sch2014.*")
dbGetQuery(db, "\dt sch2014.*")
dbGetQuery(db, "\\dt sch2014.*")
Run Code Online (Sandbox Code Playgroud)

这些都没有奏效。

这个相关的问题也存在:使用 R 在 postgres 中设置模式名称,这将通过在连接处定义模式来解决问题。然而,它还没有得到答复!

Dan*_*ega 12

以下应该有效(使用DBI_v1.1.1

DBI::dbListObjects(conn, DBI::Id(schema = 'schema_name'))
Run Code Online (Sandbox Code Playgroud)

虽然它包含您想要的所有信息,但很难访问且难以阅读。

我会推荐一些可以生成数据框的东西:

# get a hard to read table given some Postgres connection `conn`
x = DBI::dbListObjects(conn, DBI::Id(schema = 'schema_name'))

# - extract column "table" comprising a list of Formal class 'Id' objects then
# - extract the 'name' slot for each S4 object element
# could also do `lapply(d$table, function(x) x@name)`
v = lapply(x$table, function(x) slot(x, 'name'))

# create a dataframe with header 'schema', 'table'
d = as.data.frame(do.call(rbind, v))
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

d = as.data.frame(do.call(rbind, lapply(DBI::dbListObjects(conn, DBI::Id(schema = 'schema_name'))$table, function(x) slot(x, 'name'))))
Run Code Online (Sandbox Code Playgroud)

或者以更“整洁”的方式:

conn %>%
    DBI::dbListObjects(DBI::Id(schema = 'schema_name')) %>%
    dplyr::pull(table) %>%
    purrr::map(~slot(.x, 'name')) %>%
    dplyr::bind_rows()
Run Code Online (Sandbox Code Playgroud)

输出是这样的

> d
          schema     table
1    schema_name    mtcars
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案@Danton——这对我刚才真的很有帮助——小世界在这里见到你!为了通过另一行简化整洁的代码,我们还可以使用 `purrr::map_df(~slot(.x, 'name'))` 并删除 `bind_rows()`。 (2认同)

Mik*_*cer 8

阅读此答案/sf/answers/1095110481/有所帮助。我可以使用以下内容来获取与特定架构关联的表:

dbGetQuery(db,
           "SELECT table_name FROM information_schema.tables
                   WHERE table_schema='sch2014'")
Run Code Online (Sandbox Code Playgroud)