RPostgreSQL и DBI: оператор не существует: uuid = text

При использовании dbReadTable для чтения таблиц базы данных, использующих UUID в качестве первичного ключа, я получаю следующее предупреждающее сообщение.

1: В postgresqlExecStatement (conn, statement, ...): предупреждение драйвера RS-DBI: (нераспознанный тип поля PostgreSQL uuid (id: 2950) в столбце 0)

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

Ошибка в postgresqlExecStatement (conn, statement, ...): драйвер RS-DBI: (не удалось получить результат: ОШИБКА: оператор не существует: uuid = text

Я понимаю, что тип UUID недоступен в R, но есть ли способ заставить базу данных поверить, что вектор символов "unique_id" - это UUID, а не текст?

Код:

library(RPostgreSQL)
library(postGIStools)
pgdrv <- dbDriver(drvName = "PostgreSQL")

# === open connection
db <- DBI::dbConnect(pgdrv,
                     dbname="database",
                     host="localhost", port=5432,
                     user = 'postgres')

# === get tables
users <- dbReadTable(db, "app_users")

# === interaction with tables
users$employee_has_quit[1:5] <- TRUE

# === update tables
postgis_update(conn = db,
               df = users,
               tbl = "app_users",
               id_cols = "unique_id",
               update_cols = "employee_has_quit")

# === close conncetion
DBI::dbDisconnect(db)

person Christian    schedule 29.09.2018    source источник
comment
Где ошибка, в dbReadTable, если да, то почему вы вставляете все остальное под ней? или вы получаете ошибку в postgis_update?   -  person Evan Carroll    schedule 01.10.2018


Ответы (1)


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

query_text <- paste(query_text, ") AS", tbl_tmp, "(",
                    paste(quote_id(colnames(df)), collapse = ", "), ")",
                    "WHERE", paste(paste0(tbl_q, ".", id_q), "=",
                                   paste0(tbl_tmp, ".", id_q),
                                   collapse = " AND "))

Проще говоря, это не сработает. Они должны подавать в суд на заполнителей. Предполагается, что

Я предлагаю вам следовать документации,

Примечание. Этот пакет устарел. Для новых проектов мы рекомендуем использовать пакет sf для взаимодействия с базами геоданных.

Вы можете обойти это, сделав это

CREATE CAST (varchar AS uuid)
  WITH INOUT
  AS IMPLICIT;
person Evan Carroll    schedule 01.10.2018
comment
Или, если вы используете postgis с растрами, тогда пакет rpostgis работает очень хорошо и находится в активной разработке (https://github.com/mablab/rpostgis). - person MalditoBarbudo; 11.12.2019