2012-04-05 28 views
16

Tôi đang sử dụng RPostgreSQL để đọc và ghi dữ liệu. Đọc từ bất kỳ lược đồ nào hoạt động hoàn hảo, nhưng tôi không thể ghi vào các lược đồ ngoài công lập. Ví dụ, đoạn mã sau đặt một bảng trong lược đồ public, với tên myschema.tablexViết vào các lược đồ cụ thể với 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) 

Những gì tôi muốn làm, là để đặt các bảng tablex trong lược đồ myschema. Tôi cũng đã cố gắng đặt tên lược đồ trong kết nối: dbname="mydatabase.myschema" và thử đối số schemaname mà tôi thấy được đề cập đến trong một lỗi trước đó.

Không có cách nào trong số các phương pháp này hoạt động, vì vậy tôi tự hỏi liệu có phương pháp nào khác mà tôi có thể sử dụng hay không.

Trả lời

6

Giản đồ mặc định nơi các đối tượng được tạo được xác định bởi search_path. Một cách sẽ là thiết lập nó cho phù hợp. Ví dụ:

SET search_path = myschema, public; 

tôi trích dẫn manual:

Khi đối tượng được tạo ra mà không chỉ định một giản đồ mục tiêu Đặc biệt, họ sẽ được đặt trong lược đồ đầu tiên được liệt kê trong việc tìm kiếm con đường. Lỗi được báo cáo nếu đường dẫn tìm kiếm trống.

Bạn cũng có thể thực hiện điều này là default for a role, vì vậy nó được đặt tự động cho mọi kết nối được thực hiện bởi vai trò này. Hơn:

+0

Cảm ơn @Erwin. Nếu tôi có năm lược đồ, tôi có cần liệt kê tất cả chúng theo thứ tự ưa thích của tôi hay chỉ một lược đồ tôi muốn sử dụng? – djq

+0

@celenius: Bạn không cần phải liệt kê tất cả. Lược đồ đầu tiên trong 'search_path' mà vai trò hiện tại của bạn có thể truy cập sẽ được sử dụng để tạo đối tượng *. Tất cả chúng sẽ được * tìm kiếm * để các đối tượng cho đến khi chúng được tìm thấy. Các lược đồ Ohter là vô hình. Các quy tắc đặc biệt áp dụng cho các lược đồ hệ thống. Giống như một đường dẫn tìm kiếm trong một hệ thống tệp. Hướng dẫn này nói lên tất cả. –

+0

Tuy nhiên, lưu ý rằng lược đồ tiền tố một tablename trên tạo cũng sẽ hoạt động. tức là: tạo thử nghiệm lược đồ; tạo bảng test.abc (i int); \ d test.abc –

33

Sử dụng này:

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) 

Thông tin chi tiết: https://stat.ethz.ch/pipermail/r-sig-db/2011q1/001043.html

Các vấn đề liên quan