resultSet error: Issue knitting RMarkdown with SQL connection

resultSet error: Issue knitting RMarkdown with SQL connection

我正在创建具有以下一般结构的 RMarkdown 文件:

该脚本对我的分析来说运行得很好,但我在专用于合并 table 和导出到 CSV 的 SQL 块下确实得到了一个错误输出。此外,当我尝试编织成 PDF 时,它会在这些块上停止并输出类似的错误。下面是我的工作及其产生的错误的简化示例。请帮我弄清楚如何最好地处理这个错误来编织文件。在做了一些研究之后,我仍然不太确定这意味着什么。

合并我的 table 并准备导出所有内容的块:

{sql, connection = db}
DROP TABLE IF EXISTS food_table;

WITH subquery AS (
   SELECT
      menu.recipes,
      menu.menu_price AS price 
   FROM ingredients
   INNER JOIN menu on ingredients.id = menu.recipeid

   UNION

   SELECT 
      portion * unitp AS price,
      substitute AS recipes
   FROM menu
   )
SELECT
   recipes.id
   ingredients.id
INTO food_table
FROM menu

导出为 CSV 供以后使用的块:

{sql, connection = db}
COPY food_table TO '/Users/Name/Desktop/Project/food_table.csv' DELIMITER ',' CSV HEADER

当 运行 这些块中的任何一个时错误输出:postgresqlFetch(res, n, ...) 中的错误:RS-DBI 驱动程序:(resultSet 不对应于 SELECT 语句)无法执行 SQL 块

运行 knit PDF 时的错误输出:postgresqlFetch(res, n, ...) 中的错误:RS-DBI 驱动程序:(结果集不对应于 SELECT 语句)调用: ... -> fetch -> fetch -> postgresqlFetch -> .Call Execution halted

knitr SQL 引擎当前在查询的开始以查看它是否应该在后台 运行,否则默认为 SELECT 查询 DBI::dbFetch。换句话说,根据您的错误判断,它预计您的查询将包含 resultSet(即 return 数据),如果不包含则失败。

例如,如果您要直接从数据库中读取 food_table,那么该块就可以工作。将第二个块替换为:

```{sql read_food_table, connection = db, output.var = "food_table"}
SELECT * FROM food_table
```

对象 food_table 现在可用作 R 数据对象。

根据您使用的包,DBI::dbGetQuery 可能 处理您的查询,您可以强制 knitr 通过设置 max.print 区块选项:

{sql, connection = db, max.print = 0}

如果您想 运行 显示没有 return 数据的查询,这里有一个替代工作流程:

MySQLCode.sql

-- ---- create_food_table
DROP TABLE IF EXISTS food_table;

WITH subquery AS (
   SELECT
      menu.recipes,
      menu.menu_price AS price 
   FROM ingredients
   INNER JOIN menu on ingredients.id = menu.recipeid

   UNION

   SELECT 
      portion * unitp AS price,
      substitute AS recipes
   FROM menu
   )
SELECT
   recipes.id
   ingredients.id
INTO food_table
FROM menu

-- ---- export_food_table
COPY food_table TO '/Users/Name/Desktop/Project/food_table.csv' DELIMITER ',' CSV HEADER

RNotebook.Rmd

Load the SQL chunks from an external file invisibly.

```{r read_sql, include=FALSE, eval=TRUE, cache=FALSE}
knitr::read_chunk("MySQLCode.sql"))
```

Create a DB connection using the appropriate library.

```{r create_con}
library(...)
con <- dbConnect(...)
```

For each SQL chunk, display (but do not evaluate) the chunk with the `sql` engine.
Subsequently run (but do not show) the chunk with the `r` engine

```{sql create_food_table, eval=FALSE}
```
```{r execute_create_food_table, echo=FALSE}
dbExecute(con, knitr:::knit_code$get("create_food_table"))
```

```{sql export_food_table, eval=FALSE}
```
```{r execute_export_food_table, echo=FALSE}
dbExecute(con, knitr:::knit_code$get("export_food_table"))
```

命名代码块、将它们分解并使用的目的 knitr::read_chunk 意味着它们不必为使用它们的任何块重写。 是将代码拆分成块还是一次性 dbExecute 整个文件由您决定。您可能根本不需要依赖外部文件。

确保安装最新版本的 knitr (>= 1.18),因为支持 SQL 代码块是最近添加的。