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