r - 无法使用opencpu从sqlite数据库中获取结果

标签 r opencpu rsqlite

我有一个相对简单的函数来从 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/

相关文章:

r - 无法在本地 OpenCPU 单用户服务器上显示 R 脚本

r - 哪个用户在 OpenCPU 服务器端运行 R?

r - 是否可以直接在类 tbl_sql(或 tbl_dbi)上运行 SQL 查询?

r - R 包 biomaRt 和此依赖项 RSQLite 出错

r - R Markdown 中的 YAML 错误

r - 从 R 中的表中仅选择 500 行

r - doParallel,集群与核心

r - flexdashboard 导航栏中的下载按钮

r - R 热图中的颜色标签(文本)

r - 忽略文本文件标题中的#(R语言)