使用R向量查询sqlite数据库的有效方法



我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码。

values = c()
for (a in keys)
{
    result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a)
    values = c(values,results)
}

不幸的是,这个代码非常慢。有更有效的方法吗?

谢谢,

Johannes

如果aacontent不是很大,那么将其全部读取到R中,并使用类似R的匹配函数、sqldf函数或data.table函数

如果aacontent太大而keys太小,那么将keys写入sqlite表并执行联接查询。您可能会从对其中一个或两个创建索引中受益。

这些当然是R中为SQL查询任务预先构建的工具(由于您使用的是SQLite,我一定会查看sqldf),但根据我的经验,我最终只编写了许多用于构建查询的小助手包装函数。

例如,在您的案例中,您的问题实际上不是R部分,而是您想将keys中的所有值滚动到一个查询中。所以你想要一个看起来更像的查询

SELECT content FROM aacontent WHERE Id IN (val1,val2,...)

然后技巧是使用R中的CCD_ 2来构建CCD_。我倾向于在dbGetQuery上使用一个简单的包装器函数,该函数使用...参数和paste将不同部分的查询缝合在一起。类似这样的东西:

myQuery <- function(con,...){
    arg <- list(...)
    res <- dbGetQuery(con,paste(arg,collapse = ""))
    res
}

因此,当使用IN子句时,将东西缝合在一起会更容易:

myQuery(con,"SELECT content FROM aacontent WHERE Id IN (",
             paste(keys,collapse = ","),"))

请注意,如果keys中的值是字符,那就有点困难了,因为那时您需要对paste做更多的工作来在每个元素周围获得单引号,但这并不是更多的工作。

如果所讨论的数据库相当小,那么这个建议就更有意义了;如果你正在处理更大的数据,Spacedman的建议可能更值得研究。

最新更新