我希望使用R将变量中包含的值作为输入传递给postgresql查询。
目前我遵循它给出的例子:
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”)?
参考文献:
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
发布于 2020-12-16 04:15:13
对问题1的回答
它不起作用的两个原因。您得到的语法错误是由于带有RPostgresql的known issue造成的。您可以通过用$
替换?
来解决此问题。
在修复语法之后,您必须绑定参数。请参考本答案中示例的固定版本。
对问题2的回答
通过将连续整数附加到$
符号,可以在查询中传递多个参数。例如:SELECT * FROM table where integercolumn > $1 and stringcolumn = $2
。
记得在后面绑定这些参数!
在有问题的中发布的示例的修复版本
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
发布于 2019-06-24 08:41:45
参数化查询最好使用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网站(你已经在使用) Here上找到。
所以为了回应
问题1:将dbBindQuery
中的参数绑定到从dbSendQuery
而不是dbGetQuery
返回的对象上。
问题2:我对此不是很确定,但是你的参数是以列表的形式传递的。网上有很多人展示了如何使用参数化来加快查询速度。Here is one such example
https://stackoverflow.com/questions/56728611
复制相似问题