在PostgreSQL中使用r sf :: st_write到非公共模式

时间:2019-01-15 15:50:18

标签: r postgresql sf

我正在尝试将空间表写入不是PostgreSQL数据库中默认公共模式的模式。

library(sf)
library(DBI)
library(RPostgreSQL)
library(spData)

# PostgreSQL DB parameters
host <- "myHost" 
port <- 5432
username <- "myName"
dbname <- "myDb"
password <- "MyPassword"

# Connect to db  
conn <- dbConnect(PostgreSQL(), dbname = dbname, host = host, port = port, user = username, password = password)

st_write(obj = cycle_hire, dsn = conn, Id(schema="myOtherSchema", table = "myCycle")) # Write data to db - currently only writes to default schema

# Disconnect db
dbDisconnect(conn)

但这会将我的表添加到名称为"myOtherSchema"."myCycle"的公共模式中。

也在上面尝试过...

dbWriteTable(conn = conn, name = "myCycle", value = cycle_hire, Id(schema="mySchema"))

...替换为st_write,导致myCycle被写入公共模式。

我在做什么错了?

会话信息:

R version 3.4.4 (2018-03-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows Server >= 2012 x64 (build 9200)

在Centos 7 OS上运行PostgreSQL 11.1。

2 个答案:

答案 0 :(得分:4)

发生这种情况是因为您正在通过软件包RPostgreSQL连接到数据库,但是用于指定表和模式的语法是与软件包RPostgres建立的连接一起使用的。您可以使用以下方法解决此问题:

    require(RPostgres)
    conn <- dbConnect(Postgres(), dbname = dbname, host = host, port = port, 
                      user = username, password = password)
    st_write(obj = cycle_hire, dsn = conn, Id(schema="roads_spatial", table = "myCycle"))

答案 1 :(得分:0)

require(RPostgres)
    conn <- dbConnect(Postgres(), dbname = dbname, host = host, port = port, 
                      user = username, password = password)
    st_write(obj = cycle_hire, dsn = conn, Id(schema="roads_spatial", table = "myCycle"))

使用Postgres 12,我得到了一个公开的"roads_spatial"."mycycle"表,这不是预期的结果吗?

所以一个简单的回旋方式是写信给公众然后使用

dbExecute(
        conn,
        "ALTER TABLE myCycle SET SCHEMA roads_spatial")

 packageVersion("RPostgres") #[1] '1.2.0'
 packageVersion("DBI")       #[1] '1.1.0'