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及其附加参数。我已经尝试过scanand 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 指出的那样,您正在寻找的功能包含scanpaste(scan(...), collapse = "")

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

这不是您问题的完整答案,但它应该有所帮助。

您会注意到它在 paste() 函数将所有内容折叠成一行之前删除了单行注释。您不想要这样的折叠 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 回答