2

バックグラウンド:

データベースのクエリに RMySQL を使用しています。引用符で囲まれた文字列を使用してこれを正常に実行してきましたが、.sql ファイルからより長いクエリを送信したいと考えています。

SQLファイルはmypackage/inst/extdata/myquery.sql

質問:

クエリをインポートmyquery.sqlしてデータベースに送信する最良の方法は何ですか?

私が試したこと:

これが私が取り組んでいる機能です:

library(RMySQL)
library(mypackage)

myqueryfun <- function(...){
   file    <- system.file("extdata", "myquery.sql", package = "mypackage")
   query   <- SOMEFUN(file)
   con     <- dbConnect(...)
   q       <- dbSendQuery(con, query)
   result  <- fetch(q, n = -1)
   return(result)
}

SOMEFUNそのため、関数とその追加パラメーターを探しています。scanとを試しましreadLinesたが、これらの関数に対してさまざまな引数を試しました。 たとえば、取得しscan(file, sep = '\n', what = 'character')た最も近いものは ですがwriteLines(readLines(file))、ファイルの解析に関連するエラーが発生しますwriteLines(readLines())

Error in function (classes, fdef, mtable)  : 
  unable to find an inherited method for function "dbSendQuery", for signature "MySQLConnection", "NULL"
Called from: stop("unable to find an inherited method for function \"", fdef@generic, 
    "\", for signature ", cnames)

クエリが などの長さ 1 の文字ベクトルである場合、"show tables;"期待される出力が得られます。

4

2 に答える 2

3

@Andreが指摘しているように、探している関数は次のようにラップscanされpaste(scan(...), collapse = "")ます。

SOMEFUN <- function(file){
    paste(scan(file, sep = "\n", what = "character"), collapse = "")
}
于 2012-07-10T20:03:52.133 に答える
2

これはあなたの質問に対する完全な答えではありませんが、少しは役立つはずです。

paste() 関数がすべてを 1 行に折りたたむ前に、1 行のコメントが削除されていることに気付くでしょう。次のような折りたたまれた SQL 文字列は必要ありません。

SELECT * --mycomment FROM etc..

--最初のもの以降はすべて無視されるため、インタープリターによってあまり親切に扱われません。

だからこれを試してみてください...

sqlImport <- function(file) {

  sqlStr <- readLines(file)
  sqlStr <- gsub("^[ \t]+","", sqlStr)
  sqlStr <- gsub("^--.*","", sqlStr)
  sqlStr <- paste(sqlStr, collapse=" ")
  return(sqlStr)

}

sqlString <- sqlImport("mysqlfile.sql")

また、これにより、実際に関心のある .sql ファイルを簡単に取得できます。

sqlFiles <- list.files(getwd(), pattern = ".sql$", ignore.case = T)
sqlFiles
sqlString <- sqlImport(sqlFiles[2])  #where you want the second .sql file listed
于 2012-07-11T00:32:55.907 に答える