postgresql 如何将.sql文件的内容读取到R脚本中以运行查询?

pcww981p  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(6)|浏览(103)

我试过readLinesread.csv函数,但不起作用。
下面是my_script.sql文件的内容:

SELECT EmployeeID, FirstName, LastName, HireDate, City FROM Employees
WHERE HireDate >= '1-july-1993'

字符串
它保存在我的桌面上。
现在我想从我的R脚本运行这个查询。这是我的:

conn = connectDb()

fileName <- "C:\\Users\\me\\Desktop\\my_script.sql"
query <- readChar(fileName, file.info(fileName)$size)

query <- gsub("\r", " ", query)
query <- gsub("\n", " ", query)
query <- gsub("", " ", query)

recordSet <- dbSendQuery(conn, query)
rate <- fetch(recordSet, n = -1)

print(rate)
disconnectDb(conn)


在这个案子里我什么都得不到。我能尝试什么?

ezykj2lf

ezykj2lf1#

我自己在阅读sql文件时遇到了麻烦,并且发现如果sql中有任何单行注解,语法经常会被破坏。因为在R中,你将sql语句存储为单行字符串,如果sql中有任何双破折号,它将基本上注解掉双破折号后面的任何代码。
这是一个函数,我通常在阅读R中使用的.sql文件时使用。

getSQL <- function(filepath){
  con = file(filepath, "r")
  sql.string <- ""

  while (TRUE){
    line <- readLines(con, n = 1)

    if ( length(line) == 0 ){
      break
    }

    line <- gsub("\\t", " ", line)

    if(grepl("--",line) == TRUE){
      line <- paste(sub("--","/*",line),"*/")
    }

    sql.string <- paste(sql.string, line)
  }

  close(con)
  return(sql.string)
}

字符串

roqulrg3

roqulrg32#

我发现对于多行查询,readr包中的read_file()函数运行良好。你唯一需要注意的是避免单引号(双引号是可以的)。您甚至可以通过这种方式添加评论。
示例查询,保存为query.sql

SELECT 
COUNT(1) as "my_count"
-- comment goes here
FROM -- tabs work too
  my_table

字符串
然后,我可以将结果存储在数据框中

df <- dbGetQuery(con, statement = read_file('query.sql'))

8fq7wneg

8fq7wneg3#

您可以使用readr包中的read_file()函数。

fileName = read_file("C:/Users/me/Desktop/my_script.sql")

字符串
您将获得一个字符串变量fileName,其中包含所需的文本。

**注意:**使用/,而不是\\\

jogvjijk

jogvjijk4#

answer by Matt Jewett非常有用,但我想补充的是,当我试图读取sql server使用该答案生成的.sql文件时,有时会遇到以下警告:
警告消息:在readLines(con,n = 1)中:行1似乎包含嵌入的nul
在这些情况下,readLines返回的第一行通常是“*”(即UTF-16字节顺序标记)和后续行不能正确读取。我通过在 Microsoft SQL Server Management Studio 中打开sql文件并选择

文件->保存为...

然后在保存按钮旁边的小向下箭头上选择

编码保存...

选择

Unicode(UTF-8无签名)-代码页65001

从“编码”下拉菜单中。
如果您没有 * Microsoft SQL Server Management Studio*,并且使用的是Windows计算机,您也可以尝试使用默认文本编辑器打开文件,然后选择

文件->保存为...
编码:UTF-8

保存为.txt文件扩展名。
有趣的是,在***Microsoft SQL Server Management Studio***中更改文件会完全删除BOM(字节顺序标记),而在文本编辑器中更改文件会将BOM转换为UTF-8 BOM,但仍然会使用引用的答案正确读取查询。

wixjitnu

wixjitnu5#

readrtextclean的组合可以很好地工作,而不必创建任何新函数。read_file()将文件读入字符向量,replace_white()确保从.sql文件中删除所有转义序列字符。Note: Does cause problems if you have comments in your SQL string !!

library(readr)
library(textclean)

SQL <- replace_white(read_file("file_path")))

字符串

ndasle7k

ndasle7k6#

虽然有点晚了,但我今天一直在玩这个游戏,并编写了一种稍微不同的方法来收集SQL代码,以便在DBI::dbGetQuery()函数中运行:

get_sql_code_from_file <- function(file_path){

   # Get contents of file
   file_lines <- readLines(file_path)

   # Remove single line comments
   file_lines <- file_lines[grepl(pattern = "^--", file_lines) == FALSE]

   # Note indices of lines with multi-line comments start/ends
   multi_line_start_indices <- grep(pattern = "^/\\*", file_lines)
   multi_line_end_indices <- grep(pattern = "\\*/", file_lines)

   # Check if any multi-line comments found
   if (length(multi_line_end_indices) != 0) {

      # Note lines defining and within multi-line comments
      multi_line_indices <- sapply(
         seq_along(multi_line_start_indices),
         FUN = function(index, multi_line_start_indices, multi_line_end_indices){
            return(multi_line_start_indices[index]:multi_line_end_indices[index])
         },
         multi_line_start_indices, multi_line_end_indices
      )

      # Remove multi-line_comments
      file_lines <- file_lines[-multi_line_indices]
   }

   # Combine into single string
   file_string <- paste(file_lines, collapse = "\n")

   return(file_string)
}

字符串
这种方法与公认的答案不同,因为它从文件中删除了单行和多行注解。

相关问题