8

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

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

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

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

4

2 回答 2

6

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

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--;")
于 2016-05-11T18:55:03.173 回答
1

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

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

希望能帮助到你。

于 2016-05-10T15:38:58.857 回答