首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DBI & RPostgres读写Postgres大型对象

用DBI & RPostgres读写Postgres大型对象
EN

Stack Overflow用户
提问于 2021-12-08 07:53:57
回答 1查看 352关注 0票数 9

我试图在R中使用PostgreSQL的大型对象(PostgreSQL)特性,而且我在使用{DBI}/{RPostgres}编写和阅读方面遇到了一些困难。

以下是我到目前为止尝试过的:

代码语言:javascript
复制
# Getting the db
docker run --rm --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5433:5432 postgres
代码语言:javascript
复制
library(DBI)
con <- dbConnect(
  RPostgres::Postgres(),
  dbname = "postgres",
  host = "localhost",
  port = 5433,
  user = "postgres",
  password = "mysecretpassword"
)

创作作品:

代码语言:javascript
复制
> dbGetQuery(con, "SELECT lo_create(1234);")
  lo_create
1      1234

但是我很难弄清楚如何将R对象写到这个大对象中。例如,如何使用mtcars{RPostgres}在Postgres中将{DBI}编写为大型对象

然后,如何在R中再读一遍呢?

EN

回答 1

Stack Overflow用户

发布于 2022-02-19 18:18:27

考虑R的serialize() (..RData/..RDS格式的底层构建),将R对象保存到大型对象的Postgres OID列中,并使用Postgres v10+ 服务器端大对象函数创建和检索内容。下面可以通过删除所有bytea函数来处理lo_*类型。

假设表结构:

代码语言:javascript
复制
CREATE TABLE my_table(
   ...
   r_object OID
   ...
)

要追加R对象,请执行以下操作:

代码语言:javascript
复制
# PREPARED STATEMENT
sql <- "INSERT INTO my_table(r_object) VALUES (lo_from_bytea(0, ?r_obj))"

# BIND PARAMETER OF SERIALIZED RAW VECTOR
query <- DBI::sqlInterpolate(conn, sql, r_obj = serialize(mtcars))

# EXECUTE ACTION
dbExecute(conn, query)

要检索R对象:

代码语言:javascript
复制
sql <- "SELECT lo_get(r_object) AS r_data FROM my_table"
pg_data <- dbGetQuery(conn, sql)

# UNSERIALIZE RETURNED RAW VECTOR
mtcars_from_pg <- unserialize(pg_data$r_data[1])

或者,您可以使用Postgres的文本类型(长度无限)和R的dput (ASCII表示R对象)和返回的dput字符串上的eval + parse

代码语言:javascript
复制
CREATE TABLE my_table(
   ...
   r_text TEXT
   ...
)
代码语言:javascript
复制
# PREPARED STATEMENT
sql <- "INSERT INTO my_table(r_text) VALUES (?r_obj)"

# BIND PARAMETER OF DPUT STRING OUTPUT
query <- DBI::sqlInterpolate(conn, sql, r_obj = capture.output(dput(mtcars)))

# EXECUTE ACTION
dbExecute(conn, query)

# RETRIEVE CONTENT
sql <- "SELECT r_text FROM my_table"
pg_data <- dbGetQuery(conn, sql)

# UNSERIALIZE RETURNED RAW VECTOR
mtcars_from_pg <- eval(parse(text=pg_data$r_text[1]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70271590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档