2012-04-05 63 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