dplyr可以访问POSTGRES 9.3.5 VIEW吗?

时间:2014-11-05 10:46:33

标签: r postgresql dplyr

我的R(v.3.1.1)dplyr(v.0.3.0.2)可以访问我的POSTGRES 9.3.5 TABLE,但不能访问同一数据库中的我的VIEW。

dplyr是否支持访问POSTGRES 9.3.5 VIEW?

在POSTGRES中,我的VIEW定义如下:

centralstats=# \d "nicStats5"
           View "public.nicStats5"
    Column    |       Type        | Modifiers
--------------+-------------------+-----------
 affectedId   | integer           |
 timeRecorded | bigint            |
 dn           | character varying |
 bytesRx      | bigint            |

查看定义:

 SELECT "adaptorNICVnicStats"."affectedId",
    "adaptorNICVnicStats"."timeRecorded",
    "affectedId2Dn".dn,
    "adaptorNICVnicStats"."bytesRx"
   FROM "adaptorNICVnicStats",
    "affectedId2Dn"
  WHERE "adaptorNICVnicStats"."affectedId" = "affectedId2Dn"."affectedId";

IN R可以从dplyr访问我的VIEW所定义的所有数据库。 访问我的VIEW失败,如下所示:

centralstats <- src_postgres("centralstats",host = NULL, port = NULL,"postgres","Jmu2014!")
adaptorNICVnicStats <-tbl(centralstats, "adaptorNICVnicStats")
affectedId2Dn <-tbl(centralstats, "affectedId2Dn")
nicStats5 <-tbl(centralstats, "nicStats5")
## Fejl: Table nicStats5 not found in database  //* COMMENT: "Fejl" is the Danish word for ERROR

3 个答案:

答案 0 :(得分:5)

大卫,格雷格,谢谢你的反馈。

我实际上找到了解决问题的方法,我可以让dplyr读取一个VIEW 使用dplyr中的build_sql函数直接在PostgreSQL中创建一个“SQL隧道”。

让我们说nicStats6是PostgreSQL中的一个TABLE,然后我可以用

将它“导入”到dplyr中
My_nicStats6 <- tbl(centralstats, "nicStats6")

正如我原来的问题所写,这对于VIEW不起作用,所以当nicStats5是PostgreSQL中的VIEW时

My_nicStats5 <-tbl(centralstats, "nicStats5")

将导致错误“找不到表格”

然而,这个到nicStats5的“SQL隧道”可以工作:

My_nicStats5 <- tbl(centralstats, build_sql('SELECT * FROM "nicStats5"'))

答案 1 :(得分:3)

我对R一无所知。我查看了dplyr代码,看到了对名为dbListTables的函数的依赖。查看RPostgreSQL中PostgreSQL.R的源代码:

## convenience methods
setMethod("dbListTables", "PostgreSQLConnection",
      def = function(conn, ...){
          out <- dbGetQuery(conn,
                            paste("select tablename from pg_tables where schemaname !='information_schema'",
                                  "and schemaname !='pg_catalog'", ...))
          if (is.null(out) || nrow(out) == 0)
              out <- character(0)
          else
              out <- out[, 1]
          out
      },
      valueClass = "character"
      )

此函数似乎在dply代码中引用:

# Doesn't return TRUE for temporary tables
#' @export
db_has_table.PostgreSQLConnection <- function(con, table, ...) {
  table %in% db_list_tables(con)
}

还有另一个低级函数dbExistTable,它也基于pg_tables视图。

所以,你的问题的答案是否定的,dply不支持postgres观点。

但是,对dply代码的一些细微更改可能会产生您需要的内容。

-g

答案 2 :(得分:0)

您可以从视图中提取数据。而不是传递表名,传递sql命令从视图中选择所有。这与从dplyr vignette

中描述的任意sql创建表相同

表:

 nicStats5 <- tbl(centralstats, sql("select * from nicStats5"))

查看:

build_sql

注意:x <- "nicStats5" build_sql("SELECT * FROM ", x) 可以在此处使用,但该功能旨在用于转义输入中的表达式。

    <header class="mdl-layout__header">
        <div class="mdl-layout__header-row">
            <span class="mdl-layout-title">Task Manager</span>
            <div class="mdl-layout-spacer"></div>
            <div class="mdl-textfield mdl-js-textfield mdl-textfield--expandable">
                <label class="mdl-button mdl-js-button mdl-button--icon" for="search-expandable">
                    <i class="material-icons">search</i>
                </label>
                <div class="mdl-textfield__expandable-holder">
                    <input class="mdl-textfield__input" type="text" id="search-expandable" />
                    <label class="mdl-textfield__label" for="search-expandable">Search text</label>
                </div>
            </div>
        </div>
        <div class="mdl-layout-spacer"></div>
        <button class="mdl-button mdl-js-button mdl-button--fab mdl-js-ripple-effect mdl-button--colored mdl-shadow--4dp mdl-color--accent mdl-button--mini-fab mdl-badge--overlap" id="add">
            <i class="material-icons" role="presentation">add</i>
            <span class="visuallyhidden">Add</span>
        </button>
    </header>
相关问题