Col*_*FAY 9 postgresql r rpostgresql
我正在尝试在 R 中使用 PostgreSQL 的大对象(https://www.postgresql.org/docs/10/largeobjects.html{DBI}
)功能,但使用/编写和读取时遇到一些问题{RPostgres}
。
这是我到目前为止所尝试过的:
# Getting the db
docker run --rm --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5433:5432 postgres
Run Code Online (Sandbox Code Playgroud)
library(DBI)
con <- dbConnect(
RPostgres::Postgres(),
dbname = "postgres",
host = "localhost",
port = 5433,
user = "postgres",
password = "mysecretpassword"
)
Run Code Online (Sandbox Code Playgroud)
创作作品:
> dbGetQuery(con, "SELECT lo_create(1234);")
lo_create
1 1234
Run Code Online (Sandbox Code Playgroud)
但后来我很难弄清楚如何将 R 对象写入这个大对象。例如,我如何在 Postgres 中使用and编写mtcars
一个大对象?{DBI}
{RPostgres}
然后,我如何在 R 中再次读回它?
考虑使用 R serialize()
(.RData/.RDS 格式的底层构建)将 R 对象保存到OID
大型对象的 Postgres 列中,并使用 Postgres v10+服务器端大对象函数来创建和检索内容。下面可以bytea
通过删除所有lo_*
函数来处理类型。
假设表结构:
CREATE TABLE my_table(
...
r_object OID
...
)
Run Code Online (Sandbox Code Playgroud)
要附加 R 对象:
# 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)
Run Code Online (Sandbox Code Playgroud)
要检索 R 对象:
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])
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用 Postgres 的TEXT
无限长度类型和 R 类型dput
(R 对象的 ASCII 表示形式),并在返回的字符串上使用eval
+ 。parse
dput
CREATE TABLE my_table(
...
r_text TEXT
...
)
Run Code Online (Sandbox Code Playgroud)
CREATE TABLE my_table(
...
r_text TEXT
...
)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
638 次 |
最近记录: |