如何将R对象(列表)存储到SQLite数据库中?

3

我想知道是否可能通过sqldf或RSQLite直接将R列表存储到SQLite数据库中,并当然可以检索出它们。


@agstudy 是的,我们可以!但是我有点担心这种hacky方式在数据变大时的性能问题... - jack
@Jack 我的意思是你不能将列表存储在经典数据库中。Ritchie在他的回答中详细解释了这一点。 - agstudy
这并不是重复的内容,因为它是针对 sqlite 的。 - Davor Josipovic
2个回答

4
请看我在这里提供的更好的答案:https://dev59.com/zXM_5IYBdhLWcg3wZSPX#26098290 数据库表的矩形结构与列表等不规则对象不匹配。有几种方法可以解决此限制:
1. 使用dput将列表转换为文本,并将其存储在文本列中。然后在从数据库检索时使用dget获取它。
2. 您还可以将数据存储为XML或JSON格式的文本列,并在检索时对其进行解析。
3. 如果您不关心内容可读性,则还可以将其作为二进制blob存储,使用saveRDS(并使用readRDS检索)。
所有这些方法的缺点是您无法在数据库内部进行分析。它们仅适用于将数据库用作数据存储介质。
如果您想在数据库内部处理数据,则必须使其成为“矩形”格式。有关更多详细信息,请参见RDS方法:https://dev59.com/WnA65IYBdhLWcg3wqQc8#3699543。但需要注意的是,实际上比我最初预计的更麻烦,因为您需要写入文件。
l <- list(x = 1:5, y = letters)

saveRDS(l, "tmp")
bits <- readBin("tmp", "raw", 1000)
# Then send the raw data to the DB

# On retrieval reverse the process
writeBin(x, "tmp")
readRDS("tmp")

一种可能更简单的替代RDS方法。

bits <- charToRaw(paste0(deparse(l), collapse = ""))

# And the reverse:
eval(parse(text = rawToChar(bits)))

很酷,感谢您的回答 - 可读性不是问题。我只需要将DB作为有组织的存储介质,并允许多个子进程并发访问。但是,在将其存储到DB之前,我需要先保存文件,是吗?您能否给我一个使用RSQLite的saveRDS方法的最小示例? - jack

2

好的,在发布之前稍微搜索一下,参考:

将R对象存储在关系数据库中

让我们详细说明一个最小的工作示例:

library(RSQLite)
db <- dbConnect(SQLite(), dbname = "test.sqlite")
dbSendQuery(conn = db, "CREATE TABLE test (ID INTEGER, DATA STRING)")
l <- list("super", "important", "stuff")
dbSendQuery(conn = db, sprintf("INSERT INTO test VALUES (1, '%s')", 
                               rawToChar(serialize(l, NULL, TRUE))))
unserialize(charToRaw(dbReadTable(db, "test")$DATA))

愉快的编码!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接