问题:如何在RPostgreSQL查询中传递变量?
示例:在下面的示例中,我尝试将日期'2018-01-03‘传递给查询
library(RPostgreSQL)
dt <- '2018-01-03'
connect <- dbConnect(PostgreSQL(),
dbname="test",
host="localhost",
port=5432,
user="user",
password="...")
result <- dbGetQuery(connect,
"SELECT * FROM sales_tbl WHERE date = @{dt}")发布于 2018-08-02 08:15:36
您可以使用paste0生成查询并将其传递给dbGetQuery:
library(RPostgreSQL)
dt <- '2018-01-03'
connect <- dbConnect(PostgreSQL(),
dbname="test",
host="localhost",
port=5432,
user="user",
password="...")
query <- paste0("SELECT * FROM sales_tbl WHERE date='", dt, "'")
result <- dbGetQuery(connect, query)发布于 2019-02-15 18:33:38
最安全的方法是将查询参数化,如前面提到的这里。
示例:
library(RPostgreSQL)
dt <- '2018-01-03'
connect <- dbConnect(drv = PostgreSQL(),
dbname ="test",
host = "localhost",
port = 5432,
user = "user",
password = "...")
query <- "SELECT * FROM sales_tbl WHERE date= ?"
sanitized_query <- dbSendQuery(connect, query)
dbBind(sanitized_query, list(dt))
result <- dbFetch(sanitized_query)在这里,通过传递?,您可以对查询进行清理,以避免SQL注入攻击。
我喜欢做的另一件事是创建.Renviron文件来存储我的credintials。例如,对于上面的连接,.Renviron文件将如下所示。
dbname = test
dbuser = me
dbpass = mypass
dbport = 5432
dbhost = localhost保存文件,重新启动RStudio (在启动时加载.Renviron文件)。然后使用Sys.getenv(variable)访问凭据
#example:
connect <- dbConnect(drv = PostgreSQL(),
dbname = Sys.getenv("dbname"),
host = Sys.getenv("dbhost"),
port = Sys.getenv("dbport"),
user = Sys.getenv("dbuser"),
password = Sys.getenv("dbpass"))https://stackoverflow.com/questions/51648611
复制相似问题