3

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スタジオで動作し、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 に注意してください) ファイルのロックを可能にするためです。

4

1 に答える 1

1

これはおそらくセキュリティ上の制限です。メーリング リストのこの投稿を参照してください。PDF マニュアルのセクション 3.5 も参照してください。デバッグするには、以下をご覧ください。

tail -f /var/log/kern.log

アプリケーションを使用しようとしている間。. 追加すると思います

#include <abstractions/mysql>

/etc/apparmor.d/opencpu/customプロファイルに問題を解決する必要があります。

于 2014-10-24T16:25:28.120 に答える