当使用
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)
问题是 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.
我的建议是您遵循文档,
注意:此软件包已弃用。对于新项目,我们建议使用 包与地理数据库连接。您可以通过这样做来解决
CREATE CAST (varchar AS uuid)
WITH INOUT
AS IMPLICIT;