RPostgreSQL и DBI: «оператор не существует: uuid = text» - PullRequest
0 голосов
/ 29 сентября 2018

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

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

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

Ошибка в postgresqlExecStatement (conn, оператор, ...): драйвер 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)

1 Ответ

0 голосов
/ 01 октября 2018

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

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 "))

Проще говоря, это не сработает.Они должны судиться с местозаполнителями.Предполагается, что тип ввода может быть результатом make_str_quote (по доверенности df_q и quote_str) .Это ошибочное предположение, как вы видите здесь,

CREATE TABLE foo ( a uuid );
INSERT INTO foo VALUES ( quote_literal(gen_random_uuid()) ) ;

ERROR:  column "a" is of type uuid but expression is of type text
LINE 1: INSERT INTO foo VALUES ( quote_literal(gen_random_uuid()) ) ...
                                 ^
HINT:  You will need to rewrite or cast the expression.

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

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

Вы можете обойти , выполнив это

CREATE CAST (varchar AS uuid)
  WITH INOUT
  AS IMPLICIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...