在 Rmarkdown 中使用带有查询参数的 sql 块

问题描述 投票:0回答:3

我正在尝试找出是否有一种方法可以将参数传递给连接到 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

我认为现在不可能做到这一点,因为一些 DBI API 没有在

bigrquery
包中实现,我已经为此提出了 issue。还有
knitr
这里

更新3

现在可以在 sql 块中使用

params
参数。

r google-bigquery r-markdown knitr bigrquery
3个回答
2
投票

您可以使用

?
在sql块中插入R变量,请参阅在查询中使用R变量

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

0
投票

为了澄清一下,你正在使用 r 块,对吗?根据这个例子这是可能的。

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

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

0
投票

我不确定

bigquery
,但这适用于 PostgreSQL。 您需要
glue::glue_sql()
来传递一些参数。 讨论这里

```{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
```
© www.soinside.com 2019 - 2024. All rights reserved.