用R向量查询sqlite数据库的有效方法
我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码用R向量查询sqlite数据库的有效方法,sqlite,r,Sqlite,R,我在R中有一个值向量,希望从sqlite数据库中获取响应值。我使用以下代码 values = c() for (a in keys) { result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a) values = c(values,results) } values=c() 用于(钥匙中的a) { 结果如果aacontent不是很大,那么将其全部读入R,并使用R的match函数、sql
values = c()
for (a in keys)
{
result <- dbGetQuery(con," SELECT content FROM aacontent WHERE Id=?",a)
values = c(values,results)
}
values=c()
用于(钥匙中的a)
{
结果如果aacontent不是很大,那么将其全部读入R,并使用R的match函数、sqldf函数或data.table函数之类的函数
如果aacontent太大,而键太小,则将键写入sqlite表并执行联接查询。在其中一个或两个表上创建索引可能会对您有所帮助。这些都是从R中为类似的SQL查询任务预建的工具(因为您使用的是sqlite,我一定要签出sqldf),但根据我的经验,我最终编写了许多用于构建查询的小助手包装函数
例如,在您的情况下,您的问题并不是真正的R部分,而是希望将键中的所有值滚动到一个查询中。因此,您希望查询看起来更像:
SELECT content FROM aacontent WHERE Id IN (val1,val2,...)
然后诀窍是在R中使用paste
来构建in
子句。我倾向于在dbGetQuery
上使用一个简单的包装函数,它使用…
参数和paste
将不同部分的查询缝合在一起。类似这样:
myQuery <- function(con,...){
arg <- list(...)
res <- dbGetQuery(con,paste(arg,collapse = ""))
res
}
请注意,如果键
中的值是字符,则会有点困难,因为您需要使用粘贴
进行更多的工作,以在每个元素周围获得单引号,但这并不是更多的工作
如果所讨论的数据库相当小,则此建议更为相关;如果您正在处理较大的数据,则Spacedman的建议可能更值得研究。我可能会将您的SQL查询从Id=
更改为Id in(…)
。键中的值是否为字符、数字等?它们是字符。您是否建议将整个向量放在in之后的括号中?这是否会保留正确的顺序?可能不会(这取决于键的顺序)。我会在查询中同时选择content
和Id
,然后在SQLite中或在R中对结果进行排序。@Spacedman取决于设置的细节。在我的情况下,我的数据库只会被坐在我的计算机旁的人查询,因此我倾向于不担心这些事情,因为如果有人在lly有我的计算机我有比SQL注入攻击更大的问题。是的,但你必须担心的不仅仅是恶意攻击。一旦你开始构造字符串传递给SQL表达式,你就必须担心转义引号和分号等等。是否有SQL转义函数或占位符替换技术R的数据库包?谢谢,编写密钥和执行连接查询非常有帮助。
myQuery(con,"SELECT content FROM aacontent WHERE Id IN (",
paste(keys,collapse = ","),"))