在perl / python中,DBI API有一种机制可以在参数中安全地插入到sql查询中。例如在python中我会这样做:
cursor.execute("SELECT * FROM table WHERE value > ?", (5,))
其中execute方法的第二个参数是要添加到sql查询中的参数元组
R&R的DBI兼容API是否有类似的机制?我见过的例子从未显示传递给查询的参数。如果不是,在参数中插入查询最安全的方法是什么?我特意看着使用RPostgresSQL。
答案 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)
希望它有所帮助。