Не применимый метод для st_write, примененный к объекту класса "c('tbl_df', 'tbl', 'data.frame')"

Я пытаюсь перенести данные из API Thingspeak в базу данных postgres. API ограничивает каждый запрос 8000 наблюдениями, но мне нужно потянуть миллионы! Я использую R для итеративного извлечения из API, провожу споры, а затем отправляю результаты в виде data.frame к моему столу в БД.

Текущий способ, которым я делаю это, опирается на dbWriteTable() функция от RPostgres пакет. Однако этот метод не учитывает существующие наблюдения в БД. Я должен вручную DELETE FROM table_name перед запуском скрипта, или я буду писать дубликаты наблюдений каждый раз, когда пытаюсь обновить базу данных. Я все еще трачу время на переписывание удаленных наблюдений, и из-за этого сценарий занимает ~2 дня.

Я бы предпочел скрипт, который включает в себя функциональность postgres-9.5' ON CONLFICT DO NOTHING пункт, так что мне не нужно тратить время на повторную загрузку наблюдений, которые уже находятся в БД. Я нашел st_write() а также st-read() функции от sf пакеты, которые могут быть полезны для запуска SQL-запросов непосредственно из R, но столкнулись с препятствиями. В настоящее время я застрял, пытаясь загрузить 8000 наблюдений в каждом df из R в мой db. Я получаю следующую ошибку:

Подключение к базе данных:

# 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 классы.

Самый последний подход с 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

Я уверен, что это потому, что я еще не установил расширение PostGIS в своей базе данных PostgreSQL. Если бы кто-то мог подтвердить, я был бы признателен! Установка PostGIS довольно длительный процесс, поэтому я не смогу предоставить обновление в течение нескольких дней. Я надеюсь, что я решил проблему с st_write() Функция хотя!

0 ответов

Другие вопросы по тегам