我正在尝试将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_df
或tbl
类。
通过更改为以下内容,我在使用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()
功能解决了这个问题!