resultSet error: Issue knitting RMarkdown with SQL connection
resultSet error: Issue knitting RMarkdown with SQL connection
我正在创建具有以下一般结构的 RMarkdown 文件:
- 将 markdown 连接到现有 postgreSQL 数据库的块
- 块使用 SQL 连接将现有的 table 合并到一个母版中 table 然后将母版导出为 CSV 文件
- R 块将新的 CSV 文件作为数据帧读取并执行
对其进行统计分析
该脚本对我的分析来说运行得很好,但我在专用于合并 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 代码块是最近添加的。
我正在创建具有以下一般结构的 RMarkdown 文件:
- 将 markdown 连接到现有 postgreSQL 数据库的块
- 块使用 SQL 连接将现有的 table 合并到一个母版中 table 然后将母版导出为 CSV 文件
- R 块将新的 CSV 文件作为数据帧读取并执行 对其进行统计分析
该脚本对我的分析来说运行得很好,但我在专用于合并 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 代码块是最近添加的。