如何从.sql文件发送查询?

时间:2012-07-10 17:43:52

标签: mysql r odbc character

背景

我正在使用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及其附加参数。我尝试了scanreadLines,我尝试过对这些函数的不同参数,例如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;",我会得到预期的输出。

2 个答案:

答案 0 :(得分:3)

正如@Andre所指出的,您正在寻找的功能将scan包裹在paste(scan(...), collapse = "")中:

SOMEFUN <- function(file){
    paste(scan(file, sep = "\n", what = "character"), collapse = "")
}

答案 1 :(得分: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