2012-04-05 81 views
16

我使用RPostgreSQL来读取和写入数据。从任何模式读取完美,但我无法写入非公共模式。例如,下面的代码放在一个表中public架构,名为myschema.tablex使用RPostgreSQL写入特定模式

# write dataframe to postgres 
drv <- dbDriver("PostgreSQL") 
con <- dbConnect(drv, host="localhost", user="postgres", password="zzzz", dbname="mydatabase", port="5436") 
if(dbExistsTable(con,"myschema.tablex")) { 
    dbRemoveTable(con,"myschema.vkt_tablex")} 
dbWriteTable(con,"myschema.tablex", dataframe, row.names=F) 

我想要做的,是将表tablex在架构myschema。我也尝试在连接中命名模式:dbname="mydatabase.myschema"并试图在前面的错误中提到的参数schemaname

这些方法都不起作用,所以我想知道是否有另一种方法可以使用。

回答

6

对象创建的默认模式由search_path定义。一种方法是相应地设置它。例如:

SET search_path = myschema, public; 

我引用manual

如果没有指定特定的目标 模式中创建对象,它们将被放置在搜索 路径中列出的第一个模式。如果搜索路径为空,则会报告错误。

您也可以将此作为default for a role,因此对于由此角色创建的每个连接都会自动设置它。更多:

+0

感谢@Erwin。如果我有五个模式,我是否需要按照我的首选顺序列出它们,或者只是我想用'R'使用的那个? – djq 2012-04-05 17:41:58

+0

@celenius:你不必全部列出。您当前角色可以访问的“search_path”中的第一个模式将用于*对象创建*。所有这些将被*搜索*为了对象,直到他们被发现。其他模式是隐形的。特殊规则适用于系统模式。就像文件系统中的搜索路径一样。手册告诉了这一切。 – 2012-04-05 17:50:39

+0

但请注意,在创建时为表名添加前缀的模式也应该如此。即: 创建模式测试; create table test.abc(i int); \ d test.abc – 2012-04-06 16:21:37

33

使用此:

library(RPostgreSQL) 
drv <- dbDriver("PostgreSQL") 
con <- dbConnect(drv, dbname = "db", host = "host", port = 5432, 
       user = "user", password = "pwd") 
dbWriteTable(con, c("yourschema", "yourtable"), value = yourRdataframe) 
dbDisconnect(con) 

更多细节:https://stat.ethz.ch/pipermail/r-sig-db/2011q1/001043.html