没有适用于' st_write'的方法应用于课程对象" c(' tbl_df',' tbl',' data.frame')"

时间:2018-05-31 20:15:26

标签: r postgresql postgis sf rpostgresql

我正在尝试将Thingspeak API中的数据传输到postgres数据库中。 API将每个请求限制为8000次观察,但我需要花费数百万!我使用R迭代地从API中取出,进行一堆争论,然后将结果作为data.frame提交到我在db中的表中。

我这样做的当前方式依赖于dbWriteTable()包中的RPostgres函数。但是,此方法不考虑db中的现有观察。我必须在运行脚本之前手动DELETE FROM table_name,否则我每次尝试更新数据库时都会写入重复的观察结果。我还在浪费时间重写我删除的观察结果,因此脚本需要大约2天才能完成。

我更喜欢一个包含postgres-9.5'的功能的脚本。 ON CONLFICT DO NOTHING条款,因此我不必浪费时间重新上传已经在数据库中的观察结果。我发现st_write()包中的st-read()sf函数对于直接从R运行SQL查询非常有用,但遇到了障碍。目前,我试图将每个df中的8000个观测值从R上传到我的数据库。我收到以下错误:

连接数据库:

# db, host, port, pw, and user are all objects in my R environment
con <- dbConnect(drv = RPostgres::Postgres()
             ,dbname = db
             ,host = host
             ,port = port
             ,password = pw
             ,user = user)

使用RPostgres的当前方法:

dbWriteTable(con
    ,"table_name" 
    ,df 
    ,append = TRUE
    ,row.names = FALSE)

使用sf的新方法:

st_write(conn = conn
      ,obj = df
      ,table = 'table_name'
      ,query = "INSERT INTO table_name ON CONFLICT DO NOTHING;"
      ,drop_table = FALSE
      ,try_drop = FALSE
      ,debug = TRUE)

错误消息:

Error in UseMethod("st_write") : 
  no applicable method for 'st_write' applied to an object of class "c('tbl_df', 'tbl', 'data.frame')"

编辑:

严格转换为数据框,即df <- as.data.frame(df)attributes(df)$class <- "data.frame",会产生类似的错误消息,只有tbl_dftbl类。

最近使用sf的方法:

通过更改为以下内容,我在使用st_write()方面取得了一些进展:

# convert geom from WKT to feature class
df$geom <- st_as_sfc(df$geom)

# convert from data.frame to sf class
df <- st_as_sf(df)

# write sf object to db
st_write(dsn = con # changed from drv to dsn argument
    ,geom_name = "geom"
    ,table = "table_name"
    ,query = "INSERT INTO table_name ON CONFLICT DO NOTHING;"
    ,drop_table = FALSE
    ,try_drop = FALSE
    ,debug = TRUE
    )

新错误:

Error in result_create(conn@ptr, statement) : 
  Failed to fetch row: ERROR:  type "geometry" does not exist at character 345

我很确定这是因为我还没有在PostgreSQL数据库中安装PostGIS扩展程序。如果有人能证实我很感激!安装PostGIS是一个相当漫长的过程,因此我几天都无法提供更新。我希望我已经用st_write()功能解决了这个问题!

0 个答案:

没有答案