2012-04-05 4 views
16

나는 데이터를 읽고 쓰는 데 RPostgreSQL을 사용하고 있습니다. 모든 스키마 읽기는 완벽하게 작동하지만 비공개 스키마에 쓸 수는 없습니다. 예를 들어, 다음 코드는 내가 원하는 어떤 이름 myschema.tablexRPostgreSQL을 사용하여 특정 스키마에 쓰기

# 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) 

과 함께 public 스키마에 테이블을 배치, 스키마 myschema 테이블 tablex을 배치하는 것입니다. 또한 연결의 스키마 이름을 dbname="mydatabase.myschema"으로하고 이전 버그에서 언급 한 schemaname을 시도했습니다.

이러한 접근법 중 어느 것도 작동하지 않으므로 사용할 수있는 다른 방법이 있는지 궁금합니다.

답변

6

개체가 생성되는 기본 스키마는 search_path으로 정의됩니다. 한 가지 방법은 적절하게 설정하는 것입니다. 예를 들어 :

객체가 특정 대상 스키마를 지정하지 않고 생성

, 그들은 검색 경로에 나열된 첫 번째 스키마에 배치됩니다 :

SET search_path = myschema, public; 

나는 manual 인용. 검색 경로가 비어 있으면 오류가보고됩니다.

이 번호는 default for a role으로 만들 수 있으므로이 역할로 이루어진 모든 연결에 대해 자동으로 설정됩니다. 더 :

+0

감사 @Erwin. 5 개의 스키마가있는 경우 원하는 순서로 나열하거나 'R'이 사용하기 원하는 스키마 만 나열해야합니까? – djq

+0

@celenius : 모두 나열 할 필요는 없습니다. 현재 역할이 접근 할 수있는'search_path'의 첫번째 스키마는 * 객체 생성 *에 사용될 것입니다. 모든 객체는 발견 될 때까지 객체를 찾기 위해 * 검색됩니다. 더 이상의 스키마는 보이지 않습니다. 시스템 스키마에는 특별한 규칙이 적용됩니다. 파일 시스템의 검색 경로와 매우 비슷합니다. 매뉴얼에 나와 있습니다. –

+0

그러나 create에 tablename을 접두사로 사용하는 스키마도 잘 작동해야합니다. ie : create schema test; create table test.abc (i int); \ d test.abc –

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

관련 문제