Как мне заменить значения из сеанса R на заполнители переменных связывания SQL?

Я хочу повторно использовать необработанный SQL в сценарии R. Однако в SQL есть привязка переменных, которая позволяет параметризовать запрос .

Есть ли быстрый способ напрямую подставить значения из сеанса R в заполнители переменных привязки при использовании SQL в dbplyr?

Думаю, это не обязательно должен быть dbplyr, но я его использовал.

Напомню, что RMarkdown поддерживает механизм SQL, который позволяет фрагменту с SQL привязать переменные к значениям в среде (Global?). (Найдите текст «Если вам нужно привязать значения переменных R к SQL-запросам» в эту страницу.) Исходя из этого, кажется, что кто-то уже установил способ простой привязки переменных.

Например, приведенный ниже код заставляет программу «Oracle SQL Developer» предлагать мне ввести значение для :param1 при запуске.

select 
  * 
from 
  ( select 'test' as x, 'another' as y from dual )
where x = :param1 and y = :param2 

Я хотел бы взять тот же код в R и запустить его с некоторыми параметрами. Это не работает, но я думаю, что это могло бы сработать, если бы для этого была функция:

# Assume "con" is a DB connection already established to an Oracle db.
tbl( con, 

  args_for_oracle_sql( 

    "select 
      * 
    from 
      ( select 'test' as x, 'another' as y from dual )
    where x = :param1 and y = :param2 ", 

    # Passing the named parameters
    param1 = "test", 

    param2 = "another" 

  ) 
)


# Here's another interface idea that is perhaps similar to 
# what is shown here for SQL: https://bookdown.org/yihui/rmarkdown/language-engines.html#sql

raw_sql <- "
    select 
      * 
    from 
      ( select 'test' as x, 'another' as y from dual )
    where x = :param1 and y = :param2 "

# Set variables that match parameter names in the current environment.
param1 <- "test"
param2 <- "another"

tbl( con, 

  exc_with_args_for_oracle_sql( 

    # Pass raw SQL with the ":param1" markers       
    sql = raw_sql, 

    # Pass the function an environment that contains the values 
    # of the named parameters in the SQL. In this case, the 
    # current environment where I've set these values above. 
    env_with_args = environment()

  ) 
)

Кстати, я не уверен, какие из следующих библиотек нужны, но вот что я загружаю:

library(RODBC)
library(RODBCext)
library(RODBCDBI)
library(DBI)
library(dplyr)
library(dbplyr)
library(odbc)

person Kalin    schedule 23.08.2019    source источник


Ответы (1)


Используйте функцию build_sql() из dbplyr (для строк)

library(DBI)
library(dbplyr)
library(odbc)
param1 = readline("What is the value of param1 ?")  # base R
param1 = rstudioapi::askForPassword("What is the value of param1 ?") # RStudio
param2 = readline("What is the value of param2 ?")  # 

con = dbConnect('XXX') # Connection
# write your query (dbplyr)
sql_query = build_sql("select 
      * 
    from 
      ( select 'test' as x, 'another' as y from dual )
    where x = ",param1," and y = ", param2, con = con)

df = dbGetQuery(con,sql_query)
person Alexandre georges    schedule 23.08.2019