我只是想知道是否可以通过sqldf或RSQLite将R列表直接存储在SQLite数据库中(当然也可以检索它们)。
答案 0 :(得分:4)
在这里看到我的另一个,更好的答案:
https://stackoverflow.com/a/26098290/134830
像列表这样的粗糙对象不适合数据库表的矩形特性。您可以通过几种方法来解决此限制。
使用dput
将列表转换为文本,并将其存储在文本列中。当你从数据库中检索它时,dget
。
您还可以将数据作为XML或JSON存储在文本列中,并在检索时解析它。
如果您不关心可读的内容,您也可以使用saveRDS
将其存储为二进制blob(并使用readRDS
检索)。
所有这些方法的缺点是您无法对它们进行数据库内分析。它们仅适用于将数据库用作数据存储介质。
如果您想在数据库中处理数据,则必须make it rectangular。
有关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)))
答案 1 :(得分:1)
好的,发帖前略有错误的搜索,c.f。
Storing R Objects in a relational database
让我们详细说明一个最小的工作示例:
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))
快乐的编码!