我有一个相对简单的功能,可以从sqlite数据库中提取一些数据:
library(RSQLite)
db.select <- function(table="mydata", vars, rows=c()) {
vars <- paste(unlist(vars), collapse=", ")
q <- paste("SELECT ", vars, " FROM ", table, sep="")
if (length(rows) > 0) {
rows <- paste(as.character(rows), collapse=", ")
q <- paste(q, " WHERE row in (", rows, ")", sep="")
}
con <- DBI::dbConnect(RSQLite::SQLite(), "/abs/path/to.db")
res <- DBI::dbSendQuery(con, q)
data <- DBI::dbFetch(res)
DBI::dbClearResult(res)
DBI::dbDisconnect(con)
data
}
当我在R(或RStudio)中运行此代码时,对我来说效果很好:
> db.select(vars = c("gc_content"), rows=c(1:5))
gc_content
1 44.30
2 41.22
3 48.51
4 60.83
5 45.21
但是,使用opencpu使用此函数检索任何数据根本没有成功:
$ curl http://localhost/ocpu/user/bertjan/library/RParcoords/R/db.select/json -H "Content-Type: application/json" -d '{"vars":["gc_content"]}'
RS-DBI driver: (could not connect to dbname:
unable to open database file
)
In call:
sqliteNewConnection(drv, ...)
我仔细检查了文件是否存在,检查了它的权限,设置了所有文件的读/写权限,但没有任何运气。任何输入将不胜感激。
编辑1:
尝试将@Jeroen建议的对apparmor配置的更改无济于事。不过,将以下行添加到自定义文件中确实有所帮助:
/full/path/to/db rw,
但是,这只会帮助我现在得到错误:
RS-DBI驱动程序:(语句错误:数据库已锁定)
通话中:
sqliteExecStatement(conn,statement,...)
这很奇怪,因为当我在RStudio中执行完全相同的代码(具有相同的数据库文件)时,我没有收到此错误。
编辑2:如Hadley Wickham(https://twitter.com/hadleywickham/status/526739851974955008)所建议,我使用dbGetQuery简化了该函数:
db.select <- function(table="mydata", vars, rows=c()) {
vars <- paste(unlist(vars), collapse=", ")
q <- paste("SELECT ", vars, " FROM ", table, sep="")
if (length(rows) > 0) {
rows <- paste(as.character(rows), collapse=", ")
q <- paste(q, " WHERE row in (", rows, ")", sep="")
}
con <- DBI::dbConnect(RSQLite::SQLite(), "/home/bertjan/cstr.db")
data <- DBI::dbGetQuery(con, q)
DBI::dbDisconnect(con)
data
}
仍然没有任何作用,因为我得到了完全相同的行为(在R Studio中运行,在发出curl命令时给出了数据库锁定消息)。
编辑3:实际上,它仍然似乎是AppArmor的问题。我得到:
Oct 27 15:50:52 Stef kernel: [899068.612784] type=1400 audit(1414421452.965:232): apparmor="DENIED" operation="file_lock" profile="opencpu-exec" name="/path/to/db" pid=9708 comm="apache2" requested_mask="k" denied_mask="k" fsuid=33 ouid=1000
解决方案:终于找到了。最终似乎只是一个纯粹的AppArmor问题。我不得不改变:
/full/path/to/db rw,
至
/full/path/to/db rwk,
(请注意k)以便允许文件锁定。
最佳答案
这可能是安全限制。参见this post on the mailing list。另请参阅the pdf manual的3.5节。要调试,请看一下:
tail -f /var/log/kern.log
当您尝试使用您的应用程序时。 。我认为
#include <abstractions/mysql>
到
/etc/apparmor.d/opencpu/custom
配置文件应该可以解决问题。关于r - 无法使用opencpu从sqlite数据库中获取结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26548921/