我的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
答案 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>