如何使用 R 在 SQL 查询中执行参数替换? [复制]

Posted

技术标签:

【中文标题】如何使用 R 在 SQL 查询中执行参数替换? [复制]【英文标题】:How to perform parameter substitution in SQL queries using R? [duplicate] 【发布时间】:2016-11-22 16:08:56 【问题描述】:

Python 中编程特定于 SQL 的东西我已经习惯总是在执行普通 SQL 查询时使用参数替换,如下所示:

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)

他们甚至在psycopg2 文档中写道:

Never、neverNEVER 使用 Python 字符串连接 (+) 或字符串参数插值 (%) 将变量传递给 SQL 查询字符串。甚至在枪口下也没有。

现在我必须将来自R 的数据保存到 SQLite 数据库中。我尝试使用仅接受两个参数的函数dbSendQuery 来执行此操作:连接处理程序和查询本身。但是如何提供替换的参数呢?!

谷歌搜索我发现(令人惊讶!)在 R 社区中,人们总是建议使用 paste 构建 SQL 查询,然后将其提供给 dbSendQuery。但是安全和优雅呢?好像没人在乎……我个人不明白。

【问题讨论】:

您在使用 SQLite 时为什么要阅读 psycopg2 文档,这是一个 Postgres API? Parameterized queries with RODBC 的可能重复项。另见How to write parameterized sql query in R programming using Rstudio IDE 我不知道paste 命令代表安全问题... @cory google “鲍比桌”。 @HongOoi 对,我知道什么是 SQL 注入。在 R 世界中,这通常不是什么大问题,因为 SQL 查询通常不是由随机的公众成员以交互方式完成的,它们是在您自己的本地脚本中完成的。所以这个问题应该问如何清理 sql 查询中的输入,或者一些不会让人觉得这家伙在抨击 R 用户粗心和不雅的东西。 【参考方案1】:

使用 RSQLite,您可以使用 dbGetPreparedQuery 进行参数化查询(即将值绑定到准备好的语句)。见docs。但是,您必须将绑定的值作为数据框对象传递:

sql <- "SELECT * FROM stocks WHERE symbol=?"

t <- 'RHAT'
df <- dbGetPreparedQuery(con, sql, bind.data=data.frame(symbol=t))

【讨论】:

哦,谢谢@Parfait,这正是我想要的!我知道这个文档,我实际上使用搜索找到了里面的“参数”这个词,但是他们称这个过程为“SQL准备”,所以我没有找到它。

以上是关于如何使用 R 在 SQL 查询中执行参数替换? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

在带有 PDO 的 PHP 中,如何检查最终的 SQL 参数化查询? [复制]

使用 R RODBC 参数化 SQL 查询

如何在R中的sql查询中传递函数参数? [复制]

如何使用替换的参数捕获 SQL? (.NET,SqlCommand)

读书笔记:SQL 查询中的SQL*Plus 替换变量(DEFINE变量)和参数