在R DBI中将参数传递给查询的正确方法

时间:2016-05-10 07:09:44

标签: r rpostgresql r-dbi

在perl / python中,DBI API有一种机制可以在参数中安全地插入到sql查询中。例如在python中我会这样做:

cursor.execute("SELECT * FROM table WHERE value > ?", (5,))    

其中execute方法的第二个参数是要添加到sql查询中的参数元组

R&R的DBI兼容API是否有类似的机制?我见过的例子从未显示传递给查询的参数。如果不是,在参数中插入查询最安全的方法是什么?我特意看着使用RPostgresSQL。

2 个答案:

答案 0 :(得分:4)

为了完整起见,我将根据Hadley的评论添加答案。 DBI包现在具有函数sqlInterpolate,它也可以执行此操作。它需要在sql查询中命名的函数参数列表,所有函数参数都必须以?开头。摘自下面的DBI manual

sql <- "SELECT * FROM X WHERE name = ?name"
sqlInterpolate(ANSI(), sql, name = "Hadley")
# This is safe because the single quote has been double escaped
sqlInterpolate(ANSI(), sql, name = "H'); DROP TABLE--;")

答案 1 :(得分:1)

实际上,绑定变量的使用并没有得到很好的记录。无论如何,R中的ODBC命令对不同的数据库的工作方式不同。 postgres的一种可能性是这样的:

res <- postgresqlExecStatement(con, "SELECT * FROM table WHERE value > $1", c(5))
postgresqlFetch(res)
postgresqlCloseResult(res)

希望它有所帮助。