我正在使用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;"
,我会得到预期的输出。
答案 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