Запись на конкретные схемы с помощью RPostgreSQL

Я использую RPostgreSQL для чтения и записи данных. Чтение из любой схемы работает отлично, но я не могу писать в непубличные схемы. Например, следующий код помещает таблицу в схему public с именем myschema.tablex

# 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, о котором я видел, упоминается в более ранней ошибке.

Ни один из этих подходов не работает, поэтому мне интересно, есть ли другой метод, который я могу использовать.

Ответы

Ответ 1

Схема по умолчанию, где создаются объекты, определяется search_path. Один из способов - установить его соответствующим образом. Например:

SET search_path = myschema, public;

Я цитирую руководство:

Когда объекты создаются без указания конкретной цели схемы, они будут помещены в первую схему, указанную в поиске дорожка. Сообщается об ошибке, если путь поиска пуст.

Вы также можете сделать это по умолчанию для роли, поэтому он устанавливается автоматически для каждого подключения, созданного этой ролью. Подробнее:

Ответ 2

Используйте это:

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