与RODBC参数化查询(Parameterized queries with RODBC)

2019-08-31 23:22发布

我在为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。

Answer 1:

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



Answer 2:

这些是我知道使用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是参数值的命名列表。

这就是我所知道的选择范围。



文章来源: Parameterized queries with RODBC
标签: sql r rodbc