как использовать параметризованный запрос с использованием R и Rpostgres, чтобы принимать значения, содержащиеся в переменной, в качестве входных данных для psql - PullRequest
1 голос
/ 24 июня 2019

Я хочу передать значения, содержащиеся в переменных, в качестве входных данных в запрос postgresql, используя R.

В настоящее время я слежу за тем, что приводит в качестве примера:
https://db.rstudio.com/best-practices/run-queries-safely/

Using a parameterised query with DBI requires three steps.

You create a query containing a ? placeholder and send it to the database with dbSendQuery():

airport <- dbSendQuery(con, "SELECT * FROM airports WHERE faa = ?")
Use dbBind() to execute the query with specific values, then dbFetch() to get the results:

dbBind(airport, list("GPT"))
dbFetch(airport)
##   faa            name      lat       lon alt tz dst
## 1 GPT Gulfport-Biloxi 30.40728 -89.07011  28 -6   A
Once you’re done using the parameterised query, clean it up by calling dbClearResult()

dbClearResult(airport)

Вот мои текущие настройки.


install.packages("RPostgres")
#https://github.com/r-dbi/RPostgres
require(RPostgres)
require(DBI)
require(tidyr)
# RPostgreSQL::PostgreSQL()

# make connection
con <- dbConnect(RPostgres::Postgres(), dbname = 'test', 
                      host = 'mydbtest.com',
                      port = 1234, # or any other port specified by your DBA
                      user = 'test',
                      password = 'test')

rs = dbGetQuery(con, "select count(*),state from sales where created > ? and created < ? group by state")

Что я хочу сделать: Передайте две даты в качестве входных данных для запроса.

Ошибка, которую я получаю:

> rs = dbGetQuery(prod_con, "select count(*),state from sales where created > ? and created < ? group by state")
Error in result_create(conn@ptr, statement) : 
  Failed to prepare query: ERROR:  syntax error at or near "and"
LINE 1: ...count(*),state from sales where created > ? and create...

Question1 Как мне обойти эту ошибку и чем она вызвана? Я пользуюсь? заполнитель, как указано в примере.

Вопрос 2 Как передать несколько значений двум ? с как это

dbBind (con, list ("2019-06-21", "2019-06-22"))?

Ссылки:
как передать значение, хранящееся в переменной r, в столбец where в условии запроса postgresql в R

RPostgreSQL - Передача параметра в R в запрос в RPostgreSQL

1 Ответ

1 голос
/ 24 июня 2019

Параметризованные запросы лучше всего выполнять, используя bind -> send -> fetch.

Итак, где вы использовали выражение ? в вашем dbGetQuery, это будет сделано в

rs = dbSendQuery(con, "select count(*), state 
                       from sales 
                       where created > ? and created < ? group by state")

Тогда вы привяжете свои параметры к запросу dbBindQuery(rs, list(blah, blah)) Наконец-то вы dbFetchQuery(rs).

Таким образом, ваш каркас будет выглядеть так:

rs <- dbSendQuery(...) 

dbBindQuery(rs, ...)

dbFetchQuery(rs)

dbClearResult(rs)

Все это можно найти на веб-сайте Rstudio (вы уже используете) Здесь Что вы уже заметили.

Итак, в ответ на

Вопрос 1. Вы связываете свои параметры в dbBindQuery для объекта, возвращенного из dbSendQuery, а не dbGetQuery.

Вопрос 2: Я не уверен в этом, но ваши параметры передаются в списке. В Интернете много примеров людей, показывающих, как ускорить ваши запросы с помощью параметризации. Вот один такой пример

...