首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用R和Rpostgres进行参数化查询,以便接受变量中包含的值作为psql的输入

如何使用R和Rpostgres进行参数化查询,以便接受变量中包含的值作为psql的输入
EN

Stack Overflow用户
提问于 2019-06-24 08:18:59
回答 2查看 1.7K关注 0票数 1

我希望使用R将变量中包含的值作为输入传递给postgresql查询。

目前我遵循它给出的例子:

https://db.rstudio.com/best-practices/run-queries-safely/

代码语言:javascript
复制
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)

这里是我当前的设置。

代码语言:javascript
复制
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")

我想要做的事情:将两个日期作为输入传递给查询。

我收到错误:

代码语言:javascript
复制
> 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”)?

参考文献:

how to pass value stored in r variable to a column in where clause of postgresql query in R

RPostgreSQL - Passing Parameter in R to a Query in RPostgreSQL

EN

回答 2

Stack Overflow用户

发布于 2020-12-16 04:15:13

对问题1的回答

它不起作用的两个原因。您得到的语法错误是由于带有RPostgresql的known issue造成的。您可以通过用$替换?来解决此问题。

在修复语法之后,您必须绑定参数。请参考本答案中示例的固定版本。

对问题2的回答

通过将连续整数附加到$符号,可以在查询中传递多个参数。例如:SELECT * FROM table where integercolumn > $1 and stringcolumn = $2

记得在后面绑定这些参数!

在有问题的中发布的示例的修复版本

代码语言:javascript
复制
install.packages("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')

# SEND QUERY
rs = dbSendQuery(con, "SELECT count(*), state FROM sales WHERE created > $1 and created < $2 GROUP BY state")

# BIND PARAMETERS
dbBind(rs, list(date1, date2)) # where date1 and date2 are your defined variables or raw date values

# FETCH FROM DB USING QUERY
rows <- dbFetch(rs)

# CLEAR RESULT
dbClearResult(rs)

请注意,当绑定参数时,$1对应于date1

这是我的第一个堆栈溢出答案,所以如果这对你有帮助的话,我会有很大的帮助!-Jake

票数 3
EN

Stack Overflow用户

发布于 2019-06-24 08:41:45

参数化查询最好使用bind -> send -> fetch完成。

因此,当您在dbGetQuery中使用?表达式时,这将在

代码语言:javascript
复制
rs = dbSendQuery(con, "select count(*), state 
                       from sales 
                       where created > ? and created < ? group by state")

然后将参数绑定到查询dbBindQuery(rs, list(blah, blah)),最后执行dbFetchQuery(rs)

所以你的框架应该是这样的;

代码语言:javascript
复制
rs <- dbSendQuery(...) 

dbBindQuery(rs, ...)

dbFetchQuery(rs)

dbClearResult(rs)

这些都可以在你已经注意到的Rstudio网站(你已经在使用) Here上找到。

所以为了回应

问题1:将dbBindQuery中的参数绑定到从dbSendQuery而不是dbGetQuery返回的对象上。

问题2:我对此不是很确定,但是你的参数是以列表的形式传递的。网上有很多人展示了如何使用参数化来加快查询速度。Here is one such example

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56728611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档