Использование sql чанков в Rmarkdown с параметрами запроса - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь выяснить, есть ли способ передать параметры в блоки sql, подключенные к BigQuery в RMarkdown:

```{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, поэтому я поднял проблему для. И knitr пакет здесь

Ответы [ 2 ]

1 голос
/ 22 июня 2020

Вы можете использовать ? для вставки переменных R в блок sql, см. с использованием переменных R в запросах

    ```{sql connection=db,output.vars="x"}
    SELECT ?parameter_value
    ```
print(x)
<int>
10  
0 голосов
/ 20 июня 2020

Просто чтобы уточнить, вы используете r-фрагменты, верно? согласно в этом примере возможно.

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

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