我在为r的变量,我想传递给数据库。 我可以用paste
一样多读谷歌搜索结果时建议,但那是因为SQL注入漏洞的不安全。 我宁愿喜欢的东西是这样的:
x <- 42
sqlQuery(db, 'SELECT Id, Name FROM People WHERE Age > ?;', bind=c(x))
是否有可能使用参数化查询与RODBC? 如果没有,是否有一个支持他们的备选库?
我使用的是SQL Server中,RODBC 1.3-6和R 3.0.0。
我在为r的变量,我想传递给数据库。 我可以用paste
一样多读谷歌搜索结果时建议,但那是因为SQL注入漏洞的不安全。 我宁愿喜欢的东西是这样的:
x <- 42
sqlQuery(db, 'SELECT Id, Name FROM People WHERE Age > ?;', bind=c(x))
是否有可能使用参数化查询与RODBC? 如果没有,是否有一个支持他们的备选库?
我使用的是SQL Server中,RODBC 1.3-6和R 3.0.0。
Mateusz Zoltak写道RODBCext
在2014年包(基于由Brian里普利和迈克尔拉普斯利工作):
conn = odbcConnect('MyDataSource')
sqlPrepare(conn, "SELECT * FROM myTable WHERE column = ?")
sqlExecute(conn, 'myValue')
sqlFetchMore(conn)
来源: http://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html
这些是我知道使用RODBC的选项。 我知道RSQLite支持原生参数绑定,但是这通常不是大多数人的选择。
# Note that sprintf doesn't quote character values. The quotes need
# to be already in the sql, or you have to add them yourself to the
# parameter using paste().
q <- "select * from table where val1 = '%s' and val2 < %d and val3 >= %f"
sprintf(q,"Hey!",10,3.141)
# The gsub route means you can't easily use a single placeholder
# value.
q <- "select * from table where val1 = '?' and val2 < ? and val3 >= ?"
gsub("?","Value!",q,fixed = TRUE)
我处理很多对我的工作需要的各种参数罐头查询。 因为在我的情况下,我只有SELECT
权限,我跑我的代码的唯一的人,我并不真正需要担心的验证。
所以,我已经基本消失了gsub
路线,为了能够存储我的独立.sql文件的所有查询。 这是因为查询通常是足够长的时间让他们在我的.R文件只是变得笨拙。 让他们分开,使我更容易编辑,并与格式维护他们,并强调这是更合适的SQL。
所以我写了读.sql文件的查询和绑定任何参数的一些小功能。 我写的用冒号表示参数查询,即:param1:
:param2:
然后,我用这个功能来读取.sql文件:
function (path, args = NULL)
{
stopifnot(file.exists(path))
if (length(args) > 0) {
stopifnot(all(names(args) != ""))
sql <- readChar(path, nchar = file.info(path)$size)
p <- paste0(":", names(args), ":")
sql <- gsub_all(pattern = p, replacement = args, x = sql)
return(sql)
} else {
sql <- readChar(path, nchar = file.info(path)$size)
return(sql)
}
}
其中gsub_all
基本上是一个循环过来的参数和包装args
是参数值的命名列表。
这就是我所知道的选择范围。