R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表

Posted

技术标签:

【中文标题】R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表【英文标题】:R access redshift table under a schema with dplyr or RPostgreSQL 【发布时间】:2017-06-07 08:25:04 【问题描述】:

我正在尝试使用我的 mac 连接到 Redshift 中的数据库。 我设法使用 dplyr 和 RPostgreSQL 连接到 Redshift,但即使我可以看到所有可用表而不管模式如何,我也无法访问它们中的任何一个,因为它们都在不同的模式下。 我已经尝试了各种语法来指定架构,但我没有得到任何地方。

这是我的 RPostgreSQL 代码:

library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
postgre.conn <-dbConnect(drv, 
    host="localhost", port="XXXX", dbname="redshiftdb", 
    user="XXXX", password="XXXX")
dbListTables(postgre.conn)

这会列出所有表,而不考虑架构。

我可以看到特定架构下的所有表,所以这是可行的:

dbGetQuery(postgre.conn,
       "SELECT table_name FROM information_schema.tables
       WHERE table_schema='my_schema'") 

但我无法使用以下任何命令访问 my_schema.my_table 中的数据:

dbSendQuery(postgre.conn,"SELECT * FROM my_table LIMIT 10")
dbSendQuery(postgre.conn,"SELECT * FROM my_schema.my_table LIMIT 10")
dbSendQuery(postgre.conn,"SELECT * FROM my_table WHERE table_schema='my_schema' LIMIT 10")
dbSendQuery(postgre.conn,"SELECT * FROM c("my_schema", "my_table") LIMIT 10")

同样,这是我的 dplyr 代码:

library(dplyr)
dplyr.conn <- src_postgres(host="localhost", port="XXXX", 
    dbname = "redshiftdb", user = "XXXX", password = "XXXX") 
head(src_tbls(dplyr.conn)) # lists all the tables, regardless of schema

但是,这些都不起作用:

tbl(dplyr.conn, sql("SELECT * FROM my_table LIMIT 10"))
tbl(dplyr.conn, sql("SELECT * FROM my_schema.my_table LIMIT 10"))

我也尝试在这两种情况下指定搜索路径:

dplyr.conn <- src_postgres(host="localhost", port="XXXX", 
                  dbname = "redshiftdb", user = "XXXX", password = "XXXX", 
                  options="-c search_path=my_schema") 

postgre.conn <-dbConnect(drv,
             host="localhost",
             port="XXXX", 
             dbname="redshiftdb",
             user="XXXX",
             password="XXXX",
             options="-c search_path=my_schema")

但这些仍然不起作用:

tbl(dplyr.conn, sql("SELECT * FROM my_table LIMIT 10"))
dbSendQuery(postgre.conn,"SELECT * FROM my_table LIMIT 10")

有什么想法吗...?

【问题讨论】:

【参考方案1】:

使用in_schema() 命令。代码类似于:

t <- tbl(dplyr.conn, in_schema("sheman_name", "table_name")

【讨论】:

【参考方案2】:
library(glue)
schema <- "your_schema"
tbl <- "your_table"
var <- "your_var"
conn <- "your_connection_to_database"
select_query <- glue_sql('
  SELECT `var`
  FROM `schema`.`tbl` ', .con = conn)
DBI::dbGetQuery(conn, select_query)

【讨论】:

以上是关于R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dplyr 和 RPostgreSQL 将 r 连接到 redshift?

将 RpostgreSQL 与 sqldf 一起使用会使 R 崩溃

使用 dplyr 连接到 SSL 加密的远程数据库

如何中断 R 中的 RPostgresql 查询

R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库

使用 RPostgreSQL 进行 UTF-8 / Unicode 文本编码