RPostgreSQL 和 DBI:“运算符不存在:uuid = 文本”

问题描述 投票:0回答:1

当使用

dbReadTable
读取使用 UUID 作为主键的数据库表时,我收到以下警告消息。

1:在 postgresqlExecStatement(conn, statements, ...) 中: RS-DBI 驱动程序警告:(第 0 列中无法识别的 PostgreSQL 字段类型 uuid (id:2950))

当我修改加载的表并尝试使用更新数据库时,收到以下错误消息:

postgresqlExecStatement(conn, statements, ...) 中的错误: RS-DBI 驱动程序:(无法检索结果:错误:运算符不存在:uuid = 文本

我知道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)
r postgresql postgis r-dbi
1个回答
2
投票

问题是 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;
    
© www.soinside.com 2019 - 2024. All rights reserved.