【问题标题】:how to send a query from a .sql file?如何从 .sql 文件发送查询?
【发布时间】:2012-07-10 17:43:51
【问题描述】:

背景:

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

【问题讨论】:

  • 我想你已经回答了你自己的问题。从文件读取的结果应该是长度为 1 的字符向量。因此,您可以在 scanreadLines 的结果上使用 paste(..., collapse="") 将文件折叠成单个字符串。

标签: mysql r odbc character


【解决方案1】:

正如@Andre 指出的那样,您正在寻找的函数将scan 包装在paste(scan(...), collapse = "") 中:

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

【讨论】:

  • 这有帮助,除了查询用“;”分隔返回错误,例如 show tables; show databases 在 MySQL 命令行中有效,但在通过 R 函数发送时无效 dbSendQuery(con, "show tables; show databases;")
  • @Abe 您没有在问题中指定这一点。也许如果您删除 paste 包装器并使用 sapply(query, function(x) dbSendQuery(con, x))
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2021-03-08
    • 2021-09-20
    • 2021-09-19
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多