【问题标题】:How to store R objects (lists) in an SQLite database? [duplicate]如何在 SQLite 数据库中存储 R 对象(列表)? [复制]
【发布时间】:2014-09-28 13:43:47
【问题描述】:

我只是想知道是否可以通过 sqldf 或 RSQLite 将 R 列表直接存储在 SQLite 数据库中(当然也可以检索它们)。

【问题讨论】:

  • @agstudy 是的,我们可以!但是,一旦数据变大,我有点担心这种 hacky 方式的性能......
  • @Jack 我的意思是您不能像在经典数据库中那样存储列表。里奇请在他的回答中详细说明这一点。
  • 这并不是真正的重复,因为它是 sqlite-specific。

标签: r sqlite sqldf rsqlite


【解决方案1】:

在这里查看我的另一个更好的答案:

https://stackoverflow.com/a/26098290/134830


像列表这样的参差不齐的对象不能很好地适应数据库表的矩形特性。您有几个选项可以解决此限制。

使用dput 将您的列表转换为文本,并将其存储在文本列中。然后dget它从数据库中检索回来。

您还可以将数据作为 XML 或 JSON 存储在文本列中,并在检索时对其进行解析。

如果您不关心内容的可读性,您也可以将其存储为二进制 blob,使用 saveRDS(并使用 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)))

【讨论】:

  • 酷,感谢您的回答 - 可读性不是问题。我只需要数据库作为有组织的存储介质,由许多子进程并发访问。但是,我需要先保存一个文件,然后才能将它存储在数据库中,不是吗?你能给我一个使用 RSQLite 的 saveRDS 方法的最小示例吗?
【解决方案2】:

好的,发帖前搜索有点错误,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))

编码愉快!

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2013-02-07
    • 2010-11-17
    • 1970-01-01
    • 2011-02-25
    • 2012-07-17
    • 2017-04-03
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多