【问题标题】:Using sql chunks in Rmarkdown with query parameters在 Rmarkdown 中使用带有查询参数的 sql 块
【发布时间】:2020-06-19 08:58:44
【问题描述】:

我正在尝试确定是否有办法将参数传递给 RMarkdown 中连接到 BigQuery 的 sql 块:

```{r setup}
library(bigrquery)
bq_auth(path = "access_token.json")
db <- dbConnect(
  bigquery(), 
  dataset = 'my_data', 
  project = 'my-project', 
  use_legacy_sql = FALSE
)

parameter_value = 10L
```

```{sql, echo=FALSE, connection=db, output.var="x}
SELECT @parameter_value
```

```{r}
print(x)
# I want to see 10 here.
```

在此处查看 BigQuery 参数化查询文档 - https://cloud.google.com/bigquery/docs/parameterized-queries

更新 1

虽然?parameter_value 注入似乎适用于标量,但它不适用于向量,例如:

  ```{r}
  parameter_value = c(10L, 20L)
  ```

  ```{sql, echo=FALSE, connection=db, output.var="x}
    SELECT UNNEST(?parameter_value)
  ```

将失败:

vapply(values, function(x) dbQuoteLiteral(conn, x), character(1)) 中的错误:值的长度必须为 1,但 FUN(X[1]) 结果的长度为 2

带有标量的事件未使用 BigQuery 引擎来参数化查询。

更新 2

我认为现在不可能这样做,因为bigrquery 包中没有实现一些DBI APIs,我为此提出了issue。还有knitrhere

【问题讨论】:

  • 我对@9​​87654332@ 了解不多(我也没有使用sql 块的经验)但是您是否可能需要将格式正确的字符串作为parameter_value 传递? paste(c(10, 20), collapse = ", ") 之类的东西或 SQL 期望的任何语法?

标签: r google-bigquery r-markdown knitr bigrquery


【解决方案1】:

你可以使用?在sql块中插入R变量,见using R variables in queries

    ```{sql connection=db,output.vars="x"}
    SELECT ?parameter_value
    ```
print(x)
<int>
10  

【讨论】:

  • Error in UseMethod("as_bq_table") : no applicable method for 'as_bq_table' applied to an object of class "NULL"
  • ' failed x Syntax error: Unexpected "@" at [1:9] [invalidQuery]
  • 我已将您的答案更新为适合我的版本
  • 由于我没有 BigQuery 连接,因此我推断出在 SQL Server 上完美运行的方法,尽管这可行,因为 R 在发送查询之前将 ?parameter_value 替换为其 R 值。 SELECT @parameter_value 是 BigQuery 中的有效查询吗?如果没有SELECT的DECLARE部分抛出错误,你可以试试吗?
  • 很高兴你能适应它!最终的 BQ 语法是什么?
【解决方案2】:

澄清一下,您使用的是 r 块,对吗?根据this example 是有可能的。

```{r}
library(DBI)
db = dbConnect(RSQLite::SQLite(), dbname = "sql.sqlite")
```

```{sql, connection=db}
SELECT * FROM trials
```

【讨论】:

【解决方案3】:

我不确定bigquery,但这适用于 PostgreSQL。 你需要glue::glue_sql() 来传递一些参数。 讨论here

```{r }
parameter_value <- c(10L, 20L)
parameter_value = glue::glue_sql("{parameter_value*}", .con = wcon)
```

```{sql, connection=wcon, output.var="x"}
select * from t
where t.price in (?parameter_value)
limit 10
```

【讨论】:

  • 这是否适用于 rmarkdown sql 块?
  • 是的,它有效。更新了答案,块被界面隐藏了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2023-02-04
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2013-02-07
  • 2013-11-12
相关资源
最近更新 更多