我只是想知道是否可以通过 sqldf 或 RSQLite 将 R 列表直接存储在 SQLite 数据库中(当然也可以检索它们)。
问问题
2169 次
2 回答
4
在这里查看我的另一个更好的答案:
https://stackoverflow.com/a/26098290/134830
像列表这样的参差不齐的对象不能很好地适应数据库表的矩形特性。您有几个选项可以解决此限制。
使用 将您的列表转换为文本dput
,并将其存储在文本列中。然后dget
当你从数据库中检索它时。
您还可以将数据作为 XML 或 JSON 存储在文本列中,并在检索时对其进行解析。
如果您不关心内容的可读性,您也可以将其存储为二进制 blob,使用saveRDS
(并使用检索它readRDS
)。
所有这些方法都有一个缺点,即您无法对它们进行数据库内分析。它们只适合将数据库用作数据存储介质。
如果你想在数据库中处理你的数据,你必须把它变成矩形。
有关 RDS 方法的更多详细信息。这实际上比我最初预期的要痛苦,因为是的,您需要写入文件。
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)))
于 2014-09-28T14:19:01.193 回答
2
好的,发帖前搜索略有错误,cf
让我们详细说明一个最小的工作示例:
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))
快乐编码!
于 2014-09-28T14:18:42.167 回答